Пролблеммы с классами в C++ Builder

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Folko
Сообщения: 8
Зарегистрирован: 23 авг 2005, 16:43
Откуда: Minsk, Belarus

Как можно в C++ Builder в классе создать переменную типа TCanvas и инициализировать ее. Мне выдает ошибку типа
VCL style classes must be constructed using operator new
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Объекты классов VCL можно создавать только в куче.
TCanvas* canvas = new TCanvas(this);
2B OR NOT(2B) = FF
Folko
Сообщения: 8
Зарегистрирован: 23 авг 2005, 16:43
Откуда: Minsk, Belarus

Я так в хелпе и прочитал, в конструкторе этот код написал, но эта ошибка вылетает, когда в разделе private объявляю пременную типа TCanvas.

class MyClass {
public:
...
private:
TCanvas canvas;
};

MyClass::MyClass(TCanvas Cv){
*canvas = new TCanvas(this);
canvas = Cv;
}
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Ну и правильно вылезает, ты же обявляешь член класса не как ссылку на обьект. и вовобще что-то непонятное у тебя творится. Советую разобраться сначала что такое ссылка и что такое сам экземпляр класса и чем отличается

Код: Выделить всё

TCanvas canvas; 
от

Код: Выделить всё

TCanvas* pcanvas = new TCanvas;
В твоем примере должно быть так -

Код: Выделить всё

class MyClass { 
public: 
... 
private: 
TCanvas* canvas; 
}; 

MyClass::MyClass(const TCanvas& Cv){ 
canvas = new TCanvas(this); 
*canvas = Cv; 
}
Насчет корпирования другого класса в созданный могу и ошибаться, т.к. незнаю борлондовских фичей.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Данный пример не будет работать, если MyClass не является наследником от TForm, TApplication или других подходящих классов, которые необходимо передавать конструктору TCanvas() в качестве параметра. Вообще TCanvas инкапсулирует графический контекст устройства окна, проще говоря HDC. Поэтому инициализировать TCanvas нужно не в конструкторе класса (когда само окно ещё не создано), а в процедурах обработчика событий окна, как например при отрисовке.
Folko
Сообщения: 8
Зарегистрирован: 23 авг 2005, 16:43
Откуда: Minsk, Belarus

Этот пример не работает, т.к. классы со свойствами не могут быть скопированы по значению. Я сделал так:

Код: Выделить всё

class MyClass 
{public: 
 ...  
 private: 
 TCanvas* canvas; 
}; 

MyClass::MyClass(TCanvas* const Cv)
{canvas = new TCanvas(this); 
 canvas = Cv; 
} 
Теперь все работает.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

[quote="Folko"]Этот пример не работает, т.к. классы со свойствами не могут быть скопированы по значению. Я сделал так:

Код: Выделить всё

class MyClass 
&#123]

Теперь все работает.[/quote]

Ну и зря ты это сделал. Ещё раз повторюсь разберись с указателями и с тем, что ты хочешь хранить в своем классе. Посмотри повнимательнее -
[code]
MyClass::MyClass(TCanvas* const Cv)
{canvas = new TCanvas(this);  // Создаем экземпляр класса в heap и присваиваем его адрес переменной canvas 
 canvas = Cv; // копируем адрес другого экземпляра класса в туже самую переменную canvas (это значение нам передали в конструктор) 
} 
В итоге мы создали в хипе эксемпляр класса и в следующей строчке потеряли на него ссылку. Т.е. удалить мы его и вообще обратиться к нему уже никогда не сможем. А в canvas мы будем хоранить указатель переданный нам в конструкторе. Если только это и нужно то убери совсем canvas = new TCanvas(this); - эта строчка сейчас совершенно бесполезна.
Folko
Сообщения: 8
Зарегистрирован: 23 авг 2005, 16:43
Откуда: Minsk, Belarus

[quote="Hawk"]Если только это и нужно то убери совсем canvas = new TCanvas(this)]

Только это и нужно было. Благодарю. Я после Delphi никак не могу освоиться в Builder'е.
Ответить