繁体   English   中英

如何将这个VC ++ 6代码转换为VC ++ 2008?

[英]How to convert this VC++ 6 code to VC++ 2008?

原谅我,我的C ++非常生疏。 但我正在尝试使用一些旧代码并在Visual C ++ 2008下重新编译它。它最初是为Visual C ++ 6.0编写的

我得到的错误是这样的:

错误C4430:缺少类型说明符 - 假定为int。 注意:C ++不支持default-int

好吧看起来很简单。 但后来我看看有问题的代码行:

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

并且它似乎声明了类型IS。 那我错过了什么?

跟进:

我接受了Micheals的建议并添加了函数的返回类型(类),并添加了返回; 到每个人的结尾。 然后我碰到了这个:

operator=(const CString& str);

没有定义功能体......究竟是什么意思?

你需要让operator=()方法返回一些东西(如果诊断不是错误,它会假设为int,因为错误信息有点令人困惑地指出)。

通常,它将是对操作员正在处理的对象的引用,因此可以将分配链接为正常的赋值表达式。 就像是:

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

T& operator=( int i) {
     // ...
    return *this;
}

正如迈克尔所说,operator =需要一个返回类型,但这种类型可能是无效的:

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

虽然这意味着你将无法进行“菊花链”任务。

关于后续行动,可能会说禁止为班级分配:

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

使赋值op(通常是copy ctor)私有然后不实现它们意味着不可能分配(或复制)类实例,这对于大多数面向业务的类来说是理想的行为。

返回ANYTHING但是lval通常是错误的,仅用于非常特殊的情况

肯定返回一个const引用排除了赋值链(a =(b = c)),而运算符的一部分就是使类的行为类似于内置类型

对于第二个问题,声明就像用于防止复制对象一样。

来自Danny Kalev的C ++参考指南

问题:如何防止对象复制?

答案:将复制构造函数和赋值运算符声明为私有成员,而不定义它们。 任何涉及直接或间接复制该类的语句都将导致编译错误。 这种技术并不完全是优雅的画面,但在现代C ++中,没有其他方法可以低成本地阻止复制。

关于你的编辑:它只是意味着该函数已被声明,但未定义。 编译器知道它存在,因此调用它是合法的。 但它会生成链接器错误,除非编译器实际上能够在某处找到主体。

通常,您在头文件中定义函数,然后在.cpp文件中,您有类似的东西

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

这里唯一需要注意的是Foo ::前缀。 因为这个定义不在类定义本身之内,所以我们必须使用这个前缀来指定operator =我们定义属于Foo类。

好吧,那是一个赋值算子。 它有助于定义如何将其他对象(包括相同类型和其他类型)分配给它所定义的类的实例。

正确的语法是(假设您的类被称为'对象'):

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将允许这样的错误代码编译,当然有人会拉他们的头发试图弄清楚怎么了。

PS你可能想要考虑一下:如果你从返回类型中省略const并执行(A = B)= C,会发生什么? 码?

关于后续问题,在这种情况下,返回类型可以是任何内容。 但是,由于大多数赋值运算符都返回对声明它们的类的引用,因此最好只返回它,以免混淆读者。

CString& operator=(const CString& str);

据推测,此函数在类的private部分中声明。 这是使类的对象不可赋值的标准习惯用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM