Вызов статического метода класса
От: Аноним  
Дата: 15.10.04 12:23
Оценка:
Есть класс.

================
Файл PT.h :

...

class PT
{
private:
static ofstream _logFile;
...
public:
static void OpenLogFile(const string & fileName = "c:\\pt.txt");
...
};

...

==================

Файл PT.cpp:

...

ofstream PT::_logFile;

void PT::OpenLogFile(const string & filename)
{
if (!_logFile.is_open())
{
_logFile.open(filename.c_str(), ios::out);

if (_logFile)
{
_logFile << "START" << "\n";

char* ptrByteAlloc = (char*) malloc(1);
_logFile << ptrByteAlloc << "\n";

}
}
}

...

=====================
Ф-ция main():

int _tmain(int argc, _TCHAR* argv[])
{
PlanetTranay::OpenLogFile();
...
}

=====================


В какой момент создается объект filename класса string? И почему в файле вместо значения указателя ptrByteAlloc мусор?
Re: Вызов статического метода класса
От: Анатолий Широков СССР  
Дата: 15.10.04 12:29
Оценка: -1
А>В какой момент создается объект filename класса string?

До вызова OpenLogFile.

А>И почему в файле вместо значения указателя ptrByteAlloc мусор?


char* ptrByteAlloc = (char*) malloc(1); — вот здесь выделяется память, но она не обязательно должна быть заполнена нулями, используйте calloc вместо.
_logFile << ptrByteAlloc << "\n";
Re[2]: Вызов статического метода класса
От: Анатолий Широков СССР  
Дата: 15.10.04 12:31
Оценка:
А>>И почему в файле вместо значения указателя ptrByteAlloc мусор?

АШ>char* ptrByteAlloc = (char*) malloc(1); — вот здесь выделяется память, но она не обязательно должна быть заполнена нулями, используйте calloc вместо.

АШ>_logFile << ptrByteAlloc << "\n";

Ой, не на то ответил. Чтобы вывести адрес указателя надо привести его к (void*).
Re[2]: Вызов статического метода класса
От: Аноним  
Дата: 15.10.04 12:34
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>В какой момент создается объект filename класса string?


АШ>До вызова OpenLogFile.


А>>И почему в файле вместо значения указателя ptrByteAlloc мусор?


АШ>char* ptrByteAlloc = (char*) malloc(1); — вот здесь выделяется память, но она не обязательно должна быть заполнена нулями, используйте calloc вместо.

АШ>_logFile << ptrByteAlloc << "\n";




Спасибо.

Но, что значит "До вызова OpenLogFile"? До начала работы ф-ции main()?
Re[3]: Вызов статического метода класса
От: Анатолий Широков СССР  
Дата: 15.10.04 12:38
Оценка:
А>Но, что значит "До вызова OpenLogFile"? До начала работы ф-ции main()?
нет


int main()
{
   {вот здесь создается временный объект инициализированный "c:\\pt.txt"}
   PlanetTranay::OpenLogFile(); 
   {вот здесь временный объект прекращает свой жизненный пусть}
}
Re[4]: Вызов статического метода класса
От: Аноним  
Дата: 15.10.04 12:45
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>Но, что значит "До вызова OpenLogFile"? До начала работы ф-ции main()?

АШ>нет


АШ>
АШ>int main()
АШ>{
АШ>   {вот здесь создается временный объект инициализированный "c:\\pt.txt"}
АШ>   PlanetTranay::OpenLogFile(); 
АШ>   {вот здесь временный объект прекращает свой жизненный пусть}
АШ>}
АШ>



Спасибо, и с приведением к типу void* тоже все ОК
Re[4]: Вызов статического метода класса
От: ScorpZ Украина  
Дата: 15.10.04 15:08
Оценка: -1
Здравствуйте, Анатолий Широков, Вы писали:

А>>Но, что значит "До вызова OpenLogFile"? До начала работы ф-ции main()?

АШ>нет


АШ>
АШ>int main()
АШ>{
АШ>   {вот здесь создается временный объект инициализированный "c:\\pt.txt"}
АШ>   PlanetTranay::OpenLogFile(); 
АШ>   {вот здесь временный объект прекращает свой жизненный пусть}
АШ>}
АШ>


Анатолий , у меня к сам вопрос — а разве — const string & fileName — не является локальной переменной
ф-ции (метода) PlanetTranay::OpenLogFile(); ??? А раз так , то и создаваться она должна в момент вызова данного ф-ции (метода)..

int main()
{
PlanetTranay::OpenLogFile(); // {вот здесь создается временный объект инициализированный "c:\\pt.txt"}
{вот здесь временный объект прекращает свой жизненный пусть}
}
Re[5]: Вызов статического метода класса
От: Анатолий Широков СССР  
Дата: 15.10.04 15:13
Оценка:
SZ>Анатолий , у меня к сам вопрос — а разве — const string & fileName — не является локальной переменной
SZ>ф-ции (метода) PlanetTranay::OpenLogFile(); ??? А раз так , то и создаваться она должна в момент вызова данного ф-ции (метода)..

SZ>int main()

SZ>{
SZ> PlanetTranay::OpenLogFile(); // {вот здесь создается временный объект инициализированный "c:\\pt.txt"}
SZ> {вот здесь временный объект прекращает свой жизненный пусть}
SZ>}

Имеет ли значение по умолчанию аргумент функции или нет — это рояля не играет — временный объект создается и в том и в другом случае до вызова самой функции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.