【问题标题】:Code copied from a book won't compile. Deprecated or typo? [duplicate]从书中复制的代码不会编译。已弃用或错字? [复制]
【发布时间】:2016-01-20 01:18:29
【问题描述】:

这是来自免费 c++ 电子书的程序,但无法编译。 起初我把它打出来,但在意识到它不会编译后,我尝试将电子书直接复制到代码块 13.12 中。 它仍然不会编译。这本电子书来自 2010 年,因此代码可能不符合当前标准,或者某处存在语法错字。 请帮我找出问题所在。

错误是:

error: extra qualification 'Critter::' on member 'operator=' [-fpermissive]|

代码是:

#include <iostream>

using namespace std;


class Critter
{
public:
    Critter(const string& name = "", int age = 0);
    ~Critter(); //destructor prototype
    Critter(const Critter& c); //copy constructor prototype
    Critter& Critter::operator=(const Critter& c); 
op
    void Greet() const;

private:
    string* m_pName;
    int m_Age;
};

Critter::Critter(const string& name, int age)
{
    cout << "Constructor called\n";
    m_pName = new string(name);
    m_Age = age;
}

Critter::~Critter() //destructor definition
{
    cout << "Destructor called\n";
    delete m_pName;
}

Critter::Critter(const Critter& c) //copy constructor definition
{
    cout << "Copy Constructor called\n";
    m_pName = new string(*(c.m_pName));
    m_Age = c.m_Age;
}

Critter& Critter::operator=(const Critter& c) 
{
    cout << "Overloaded Assignment Operator called\n";
    if (this != &c)
    {
        delete m_pName;
        m_pName = new string(*(c.m_pName));
        m_Age = c.m_Age;
    }
    return *this;
}

void Critter::Greet() const
{
    cout << "I’m " << *m_pName << " and I’m " << m_Age << " years old.\n";
    cout << "&m_pName: " << cout << &m_pName << endl;
}

void testDestructor();
void testCopyConstructor(Critter aCopy);
void testAssignmentOp();

int main()
{
    testDestructor();
    cout << endl;

    Critter crit("Poochie", 5);
    crit.Greet();
    testCopyConstructor(crit);
    crit.Greet();
    cout << endl;

    testAssignmentOp();
    return 0;

}
void testDestructor()
{
    Critter toDestroy("Rover", 3);
    toDestroy.Greet();
}
void testCopyConstructor(Critter aCopy)
{
    aCopy.Greet();
}
void testAssignmentOp()
{
    Critter crit1("crit1", 7);
    Critter crit2("crit2", 9);
    crit1 = crit2;
    crit1.Greet();
    crit2.Greet();
    cout << endl;

    Critter crit3("crit", 11);
    crit3 = crit3;
    crit3.Greet();
}

【问题讨论】:

  • 从这里的函数声明中删除类限定符Critter&amp; Critter::operator=(const Critter&amp; c); => Critter&amp; operator=(const Critter&amp; c);
  • 我猜你的书期待 MS 编译器中的非标准编译器功能。
  • 仍然无法编译。现在错误是错误:'op' 没有命名类型。下一个错误是: error: no 'void Critter::Greet() const' member function declaration in class 'Critter' 然后接下来的 7 个错误是这个重复错误: error: 'class Critter' has no member named '问候'

标签: c++ codeblocks


【解决方案1】:

就像消息中说的那样,里面有一个额外的Critter::

Critter& Critter::operator=(const Critter& c); 

由于这是在类声明中,它必须是类的成员,不需要以类名作为前缀。

Critter& operator=(const Critter& c); 

是正确的形式。

类名前缀仅在成员定义在类外部时使用,就像示例后面的代码中一样。

【讨论】:

  • 现在错误是错误:'op'没有命名类型
  • 而下一个错误是:error: no 'void Critter::Greet() const' member function declaration in class 'Critter'|
  • 接下来的 7 个错误就是这个重复错误:error: 'class Critter' has no member named 'Greet'|
  • @Cody 您的代码中似乎无缘无故地在一行中出现了“op”。制作电子书时可能出错。删除显示op 的行。
  • 哦,当我注释掉类定义中的随机“op”时,它会编译,但我不知道这是否会导致问题。书中有那个操作,但我不知道它有什么作用。
【解决方案2】:

从该运算符原型中删除 Critter::

【讨论】:

  • 仍然无法编译。现在错误是错误:'op' 没有命名类型。下一个错误是: error: no 'void Critter::Greet() const' member function declaration in class 'Critter' 然后接下来的 7 个错误是这个重复错误: error: 'class Critter' has no member named '问候'
  • 正如另一个答案中所指出的那样 - op 的东西一定是错误的,需要删除。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多