Как преобразовать этот код VC ++ 6 в VC ++ 2008? - PullRequest
2 голосов
/ 11 апреля 2009

Простите, мой C ++ невероятно ржавый. Но я пытаюсь взять старый код и перекомпилировать его под Visual C ++ 2008. Первоначально он был написан для Visual C ++ 6.0

.

Я получаю следующую ошибку:

ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int

Хорошо, кажется достаточно просто. Но потом я смотрю на оскорбительную строку кода:

operator=(int i) {SetAsInt(i);};

И, похоже, объявлен тип IS. Так чего мне не хватает?

СЛЕДУЙТЕ ЗА:

Я воспользовался советом Micheals и добавил тип возврата функции (класс) и добавил return this; в конце каждого. Затем я наткнулся на это:

operator=(const CString& str);

Не определено тело функции ... что именно это означает?

Ответы [ 7 ]

7 голосов
/ 11 апреля 2009

Вам нужно, чтобы метод operator=() возвращал что-то (он бы предполагал int, если бы диагностика не была ошибкой, как указывает сообщение об ошибке с некоторым смущением).

Как правило, это будет ссылка на объект, над которым работает оператор, поэтому назначения могут быть связаны как в обычном выражении присваивания. Что-то вроде:

// where T is the class for this operator= implementation

T& operator=( int i) {
     // ...
    return *this;
}
3 голосов
/ 11 апреля 2009

Как сказал Майкл, оператору = требуется тип возврата, но этот тип может быть пустым:

class A {
   ...  
   void operator = ( int i ) {
      SetAsInt(i);
   }
};

хотя это означает, что вы не сможете выполнять "последовательные" задания.

Что касается продолжения, то, вероятно, говорится, что назначение для класса запрещено:

class B {
    private:
        void operator =( const B & );    
};

Если сделать назначение op (и обычно copy ctor) закрытым, а затем не реализовать его, это означает, что невозможно присвоить (или скопировать) экземпляры классов, что является желательным поведением для большинства бизнес-ориентированных классов.

2 голосов
/ 25 июля 2009

возвращает НИЧЕГО, но lval обычно неверен и используется только в очень особых ситуациях

безусловно, возврат константной ссылки исключает цепочку присваивания (a = (b = c)), а часть операторов заключается в том, чтобы заставить классы вести себя как встроенные типы

2 голосов
/ 11 апреля 2009

Относительно вашего редактирования: Это просто означает, что функция была объявлена, но не определена. Компилятор знает, что он существует, поэтому его можно назвать законным. Но он сгенерирует ошибку компоновщика, если компилятор не сможет где-нибудь найти тело.

Как правило, вы определяете функцию в заголовочном файле, а затем в .cpp файле вы видите что-то вроде

// Assuming the class it is a member of is called Foo
Foo& Foo::operator=(const CString& str) {
 ...
}

Единственное, что следует отметить, это префикс Foo ::. Поскольку это определение находится за пределами самого определения класса, мы должны использовать этот префикс, чтобы указать, что определяемый нами оператор = принадлежит классу Foo.

2 голосов
/ 11 апреля 2009

Что касается вашего второго вопроса, объявление, вероятно, используется для предотвращения копирования объекта.

С Справочное руководство C ++ Данни Калева

Вопрос: Как я могу предотвратить Объектно-копирование?

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

1 голос
/ 12 апреля 2009

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

CString& operator=(const CString& str);

Предположительно, эта функция объявлена ​​в разделе private класса. Это стандартная идиома, делающая объекты класса не присваиваемыми.

1 голос
/ 11 апреля 2009

Ну, это оператор присваивания. Это помогает определить, как другие объекты (того же самого и других типов) назначаются экземпляру класса, в котором он определен.

Правильный синтаксис (при условии, что ваш класс называется 'Object'):

const Object& operator=(const Object& other)
{
  // copy members, one at a time.
  this->member1 = other.member1;
  return *this;
}

Обратите внимание, что тип возвращаемого значения является постоянным. Это позволяет избежать семантически неверных, синтаксически правильных утверждений, таких как:

Object A, B, C;

(A = B) = C;

Если вы определяете тип возвращаемого значения как константу, приведенный выше код не будет компилироваться (достаточно разумно, так как он действительно испорчен), в то время как опускание const позволит скомпилировать такой плохой код, и, конечно же, кто-то попытается, выяснить, что не так.

P.S. Возможно, вы захотите обдумать это: что произойдет, если вы пропустите const из возвращаемого типа и выполните (A = B) = C; код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...