Пролблеммы с классами в C++ Builder
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Как можно в C++ Builder в классе создать переменную типа TCanvas и инициализировать ее. Мне выдает ошибку типа
VCL style classes must be constructed using operator new
VCL style classes must be constructed using operator new
Я так в хелпе и прочитал, в конструкторе этот код написал, но эта ошибка вылетает, когда в разделе private объявляю пременную типа TCanvas.
class MyClass {
public:
...
private:
TCanvas canvas;
};
MyClass::MyClass(TCanvas Cv){
*canvas = new TCanvas(this);
canvas = Cv;
}
class MyClass {
public:
...
private:
TCanvas canvas;
};
MyClass::MyClass(TCanvas Cv){
*canvas = new TCanvas(this);
canvas = Cv;
}
Ну и правильно вылезает, ты же обявляешь член класса не как ссылку на обьект. и вовобще что-то непонятное у тебя творится. Советую разобраться сначала что такое ссылка и что такое сам экземпляр класса и чем отличается
от
В твоем примере должно быть так -
Насчет корпирования другого класса в созданный могу и ошибаться, т.к. незнаю борлондовских фичей.
Код: Выделить всё
TCanvas canvas;
Код: Выделить всё
TCanvas* pcanvas = new TCanvas;
Код: Выделить всё
class MyClass {
public:
...
private:
TCanvas* canvas;
};
MyClass::MyClass(const TCanvas& Cv){
canvas = new TCanvas(this);
*canvas = Cv;
}
Данный пример не будет работать, если MyClass не является наследником от TForm, TApplication или других подходящих классов, которые необходимо передавать конструктору TCanvas() в качестве параметра. Вообще TCanvas инкапсулирует графический контекст устройства окна, проще говоря HDC. Поэтому инициализировать TCanvas нужно не в конструкторе класса (когда само окно ещё не создано), а в процедурах обработчика событий окна, как например при отрисовке.
Этот пример не работает, т.к. классы со свойствами не могут быть скопированы по значению. Я сделал так:
Теперь все работает.
Код: Выделить всё
class MyClass
{public:
...
private:
TCanvas* canvas;
};
MyClass::MyClass(TCanvas* const Cv)
{canvas = new TCanvas(this);
canvas = Cv;
}
[quote="Folko"]Этот пример не работает, т.к. классы со свойствами не могут быть скопированы по значению. Я сделал так:
В итоге мы создали в хипе эксемпляр класса и в следующей строчке потеряли на него ссылку. Т.е. удалить мы его и вообще обратиться к нему уже никогда не сможем. А в canvas мы будем хоранить указатель переданный нам в конструкторе. Если только это и нужно то убери совсем canvas = new TCanvas(this); - эта строчка сейчас совершенно бесполезна.
Код: Выделить всё
class MyClass
{]
Теперь все работает.[/quote]
Ну и зря ты это сделал. Ещё раз повторюсь разберись с указателями и с тем, что ты хочешь хранить в своем классе. Посмотри повнимательнее -
[code]
MyClass::MyClass(TCanvas* const Cv)
{canvas = new TCanvas(this); // Создаем экземпляр класса в heap и присваиваем его адрес переменной canvas
canvas = Cv; // копируем адрес другого экземпляра класса в туже самую переменную canvas (это значение нам передали в конструктор)
}
[quote="Hawk"]Если только это и нужно то убери совсем canvas = new TCanvas(this)]
Только это и нужно было. Благодарю. Я после Delphi никак не могу освоиться в Builder'е.
Только это и нужно было. Благодарю. Я после Delphi никак не могу освоиться в Builder'е.