atg
02/09/2005, 16:38
Soru 1 - )
#include "stdafx.h"
void f1( std::vector<std::string>& vect )
{
std::string s = "abc xyz";
vect.push_back( s );
}
int _tmain(int argc, _TCHAR* argv[])
{//12
std::vector<std::string> vect;
for( int i = 0; i < 500000; i++ )
f1( vect );
int x = 5;//19
vect.clear();
x = 7;//23
return 0;
}
Yukarıdaki basit programın çalışması esnasında, 12 nolu satıra gelindiğinde program hafıza üzerinde 1556K yer kaplamakta, 19. satıra gelindiğinde bu değer 23552K ya yükseliyor, 23 numaralı satırda ise programın hafıza üzerinde kapladığı yer üzerinde hiçbir değişim yok; 23552K.
Adı geçen string dinamik olarak ayrılmadığı ve clear() çağırıldığı halde neden vector ün içi boşaltılmış vaziyette değil?
Soru 2 - )
#include <hash_map>
int _tmain(int argc, _TCHAR* argv[])
{
stdext::hash_map<std::string*, int> hm;
std::string* s1 = new std::string( "abc xyz" );
std::string* s2 = new std::string( "abc xyz 2" );
hm.insert( make_pair( s1, 1 ) );
hm.insert( make_pair( s2, 2 ) );
stdext::hash_map<std::string*, int>::iterator i;
for( i = hm.begin(); i != hm.end(); ++i )
delete *i;//16
return 0;
}
Yukarıdaki kodlarda( Satır 16 ) neden hata( * ) alıyorum? yada en azından bunu düzeltmem için ne yapmam gerekiyor?
* main.cpp(35) : error C2440: 'delete' : cannot convert from 'std::pair<_Ty1,_Ty2>' to 'void *'
Soru 3 - )
#include <iostream>
#include <vector>
class A
{
public:
virtual void Perform() = 0;
};
class AA : A
{
public:
void Perform()
{
std::cout<< "Merhaba Dunya";
}
};
class B
{
private:
std::vector<A*> vect;
public:
void push( A* a )
{
vect.push_back( a );
}
//Bu fonksiyon private olarak geçecek
//İfade amacıyla public durumunda
void Execute( )
{
std::vector<A*>::iterator i;
for( i = vect.begin(); i != vect.end(); ++i )
(*i)->Perform();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B* obj_b = new B();
AA* aa = new AA();
obj_b->push( ( A* )aa );
obj_b->Execute();
return 0;
}
Yukarıdaki gibi bir durumda A sınıfına bağlı Perform() işlevinin bir parametre alması gerekiyor ama parametre A sınıfı yerine ondan türetilmiş AA sınıfı içerisinden kullanılacak, parametreyi veren kişi A sınıfından AA sınıfını türeten programcı olacak ve yine parametreyi AA::Perfom() fonksiyonunda kullanacak, fakat parametrenin 'cinsi' belli değil, yani bir int, std::vector yada başka bir şey olabilir, tamamiyle belirsiz, belirli olan tek şey ise bizim sadece parametrenin 'taşıyıcılığını' yaptığımız.
Bu şartlar altında A::Perform fonksiyonuna verilebilecek parametrenin 'cinsi' konusunda en fazla esnekliği ve program tutarlılığını yakalayabilmemiz için ne tür bir yol izlemeliyiz? template? void*? taban nesne? üye değişken? yada ne?
#include "stdafx.h"
void f1( std::vector<std::string>& vect )
{
std::string s = "abc xyz";
vect.push_back( s );
}
int _tmain(int argc, _TCHAR* argv[])
{//12
std::vector<std::string> vect;
for( int i = 0; i < 500000; i++ )
f1( vect );
int x = 5;//19
vect.clear();
x = 7;//23
return 0;
}
Yukarıdaki basit programın çalışması esnasında, 12 nolu satıra gelindiğinde program hafıza üzerinde 1556K yer kaplamakta, 19. satıra gelindiğinde bu değer 23552K ya yükseliyor, 23 numaralı satırda ise programın hafıza üzerinde kapladığı yer üzerinde hiçbir değişim yok; 23552K.
Adı geçen string dinamik olarak ayrılmadığı ve clear() çağırıldığı halde neden vector ün içi boşaltılmış vaziyette değil?
Soru 2 - )
#include <hash_map>
int _tmain(int argc, _TCHAR* argv[])
{
stdext::hash_map<std::string*, int> hm;
std::string* s1 = new std::string( "abc xyz" );
std::string* s2 = new std::string( "abc xyz 2" );
hm.insert( make_pair( s1, 1 ) );
hm.insert( make_pair( s2, 2 ) );
stdext::hash_map<std::string*, int>::iterator i;
for( i = hm.begin(); i != hm.end(); ++i )
delete *i;//16
return 0;
}
Yukarıdaki kodlarda( Satır 16 ) neden hata( * ) alıyorum? yada en azından bunu düzeltmem için ne yapmam gerekiyor?
* main.cpp(35) : error C2440: 'delete' : cannot convert from 'std::pair<_Ty1,_Ty2>' to 'void *'
Soru 3 - )
#include <iostream>
#include <vector>
class A
{
public:
virtual void Perform() = 0;
};
class AA : A
{
public:
void Perform()
{
std::cout<< "Merhaba Dunya";
}
};
class B
{
private:
std::vector<A*> vect;
public:
void push( A* a )
{
vect.push_back( a );
}
//Bu fonksiyon private olarak geçecek
//İfade amacıyla public durumunda
void Execute( )
{
std::vector<A*>::iterator i;
for( i = vect.begin(); i != vect.end(); ++i )
(*i)->Perform();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
B* obj_b = new B();
AA* aa = new AA();
obj_b->push( ( A* )aa );
obj_b->Execute();
return 0;
}
Yukarıdaki gibi bir durumda A sınıfına bağlı Perform() işlevinin bir parametre alması gerekiyor ama parametre A sınıfı yerine ondan türetilmiş AA sınıfı içerisinden kullanılacak, parametreyi veren kişi A sınıfından AA sınıfını türeten programcı olacak ve yine parametreyi AA::Perfom() fonksiyonunda kullanacak, fakat parametrenin 'cinsi' belli değil, yani bir int, std::vector yada başka bir şey olabilir, tamamiyle belirsiz, belirli olan tek şey ise bizim sadece parametrenin 'taşıyıcılığını' yaptığımız.
Bu şartlar altında A::Perform fonksiyonuna verilebilecek parametrenin 'cinsi' konusunda en fazla esnekliği ve program tutarlılığını yakalayabilmemiz için ne tür bir yol izlemeliyiz? template? void*? taban nesne? üye değişken? yada ne?