Страница 1 из 1

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

Добавлено: 23 авг 2005, 16:58
Folko
Как можно в C++ Builder в классе создать переменную типа TCanvas и инициализировать ее. Мне выдает ошибку типа
VCL style classes must be constructed using operator new

Добавлено: 23 авг 2005, 18:13
Absurd
Объекты классов VCL можно создавать только в куче.
TCanvas* canvas = new TCanvas(this);

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

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

MyClass::MyClass(TCanvas Cv){
*canvas = new TCanvas(this);
canvas = Cv;
}

Добавлено: 24 авг 2005, 13:21
Hawk
Ну и правильно вылезает, ты же обявляешь член класса не как ссылку на обьект. и вовобще что-то непонятное у тебя творится. Советую разобраться сначала что такое ссылка и что такое сам экземпляр класса и чем отличается

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

TCanvas canvas; 
от

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

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

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

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

MyClass::MyClass(const TCanvas& Cv){ 
canvas = new TCanvas(this); 
*canvas = Cv; 
}
Насчет корпирования другого класса в созданный могу и ошибаться, т.к. незнаю борлондовских фичей.

Добавлено: 24 авг 2005, 15:20
WinMain
Данный пример не будет работать, если MyClass не является наследником от TForm, TApplication или других подходящих классов, которые необходимо передавать конструктору TCanvas() в качестве параметра. Вообще TCanvas инкапсулирует графический контекст устройства окна, проще говоря HDC. Поэтому инициализировать TCanvas нужно не в конструкторе класса (когда само окно ещё не создано), а в процедурах обработчика событий окна, как например при отрисовке.

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

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

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

MyClass::MyClass(TCanvas* const Cv)
{canvas = new TCanvas(this); 
 canvas = Cv; 
} 
Теперь все работает.

Добавлено: 24 авг 2005, 16:53
Hawk
[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); - эта строчка сейчас совершенно бесполезна.

Добавлено: 24 авг 2005, 23:28
Folko
[quote="Hawk"]Если только это и нужно то убери совсем canvas = new TCanvas(this)]

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