Я могу создать объект того же типа как самого?

Разрешение перегрузки является одной из самых ужасных частей C++

В основном, компилятор находит соответствие имени "DoSomething (интервал)" в пределах B, видит, что параметры не соответствуют, и остановки с ошибкой.

Это может быть преодолено при помощи A:: DoSomething в классе B

class A  
{  
  public:  
    int DoSomething() {return 0;}
};  

class B : public A  
{  
  public:  
    using A::DoSomething;
    int DoSomething(int x) {return 1;} 
};   


int main(int argc, char** argv)
{
  B* b = new B();  
  // b->A::DoSomething();    // still works, but...
  b->DoSomething();    // works now too
  delete b;  
  return 0;
}
5
задан WeGoToMars 25 November 2009 в 11:20
поделиться

5 ответов

но интересно, долго ли будет время / скрытые негативные эффекты.

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

5
ответ дан 13 December 2019 в 05:37
поделиться

Я думаю, вы правы, этот фрагмент кода мне кажется неправильным. Вы всегда должны разъяснять, кто несет ответственность за освобождение возвращаемого вами объекта. В большинстве случаев этот объект не будет освобожден.

Лучше позволить вызывающему объекту создать объект, передать его вашему методу (тогда вам понадобится только процедура), который его изменяет.

Мне любопытно. чтобы знать, почему вы хотите вернуть «слегка измененную версию» вашего объекта. Мне это кажется нелогичным ...

2
ответ дан 13 December 2019 в 05:37
поделиться

Как говорили другие, в этом нет ничего плохого, но могут быть способы получше.

Вариант 1: Измените это на метод класса и дайте ему осмысленное имя.

class function TMyObject.CreateSpecialized: TMyObject;
begin
  Result := TMyObject.Create;
  //initialize Result
end;

anObj := TMyObject.CreateSpecialized;

Вариант 2 : Используйте конструктор. У вас может быть несколько конструкторов в классе.

constructor TMyObject.CreateSpecialized;
begin 
  Create; // make sure everything is initialized correctly
  // now do custom initialization
end;

anObj := TMyObject.CreateSpecialized;

Использование одинаково в обоих примерах, но во втором случае ваши намерения более ясны для случайного читателя.

Если вы хотите взять один объект и создать другой на основе полей первого объекта , используйте конструктор с параметром.

constructor TMyObject.CreateSpecialized(obj: TMyObject);
begin
  Create;
  intField := obj.IntField * 2;
end;

anObj := TMyObject.CreateSpecialized(otherObj);
2
ответ дан 13 December 2019 в 05:37
поделиться

Если у вас есть новый класс, производный от TMyObject, например TMyOtherObject = class (TMyObject) , функция TrimEnds все равно вернет TMyObject вместо TMyOtherObject, как и следовало ожидать.

Вы можете исправить это, используя следующую схему:

TMyObjectClass = class of TMyObject;

function TMyObject.TrimEnds: TMyObject;
begin
  Result:= TMyObjectClass(ClassType).Create;
  Result.DoStuff;
end;
2
ответ дан 13 December 2019 в 05:37
поделиться

, в том, что вы написали, нет абсолютно ничего плохого. вы просто возвращаете объект, и это совершенно верно, это может быть любой другой объект любого другого типа.

1
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: