首页 > 解决方案 > C++ 初始化常量

问题描述

我需要能够在构造函数中初始化一个 const 成员,每次创建一个新对象时它都会计数。我在学校被展示了它是如何工作的,但我一直在出错。这与复制构造函数有关。

这是代码和编译器错误:

class kunde {
public:
    kunde(string name, int alter);
    kunde(const kunde& orig);
    ~kunde();
    int GetAlter() const;
    string GetName() const;
    const int GetKnr() const;

private:
    string name;
    int alter;

    const int knr;

    static int cnt;
    static int MaxKnr;
};

int kunde::cnt = 0;
int kunde::MaxKnr = 1000;

kunde::kunde(string name, int alter):knr(MaxKnr++) {
    this->name = name;
    this->alter = alter;
}

kunde::kunde(const kunde& orig):knr(MaxKnr++){
    this->name = orig.name;
    this->alter = orig.alter;
}

kunde::~kunde() {
}

int kunde::GetAlter() const {
    return alter;
}

string kunde::GetName() const {
    return name;
}

const int kunde::GetKnr() const {
    return knr;
}
        main.cpp:在函数'int main(int,char**)'中:
    main.cpp:35:15:错误:使用已删除的函数 'kunde& kunde::operator=(const kunde&)'
          v[0] = v[1];
               ^
    在 main.cpp:17:0 包含的文件中:
    kunde.h:19:7: 注意:'kunde& kunde::operator=(const kunde&)' 被隐式删除,因为默认定义格式不正确:
     类昆德{
           ^~~~~
    kunde.h:19:7: 错误:非静态 const 成员 'const int kunde::knr',不能使用默认赋值运算符

标签: c++constructorcopyconstants

解决方案


knr应该是一个帐号。每次创建对象时,它都会创建一个新的 const 帐号并保留。

如评论中所述,因为knris const,编译器无法为该类生成默认的复制分配operator=,这正是编译器抱怨的v[0] = v[1];语句:

注意: 'kunde& kunde::operator=(const kunde&)' 被隐式删除,因为默认定义格式错误

const成员一旦初始化就不能重新分配,因此不能被复制。

a 中的元素vector必须是CopyAssignableand CopyConstructible(至少在 C++11 之前),但是您的类没有可行的 copy-assignment operator=,所以它不是CopyAssignable(而且它也不MoveAssignable在 C++11 中,因为可行的移动-operator=也无法生成分配)。

解决方案是实现忽略的复制分配operator=(以及可选的移动分配) ,例如:operator=knr

class kunde {
public:
    kunde(string name, int alter);
    kunde(const kunde& orig);
    kunde(kunde&& orig);
    ...
    kunde& operator=(const kunde& rhs);
    kunde& operator=(kunde&& rhs);
    ...

private:
    string name;
    int alter;
    const int knr;
    ...
};

kunde::kunde(string name, int alter)
    : knr(MaxKnr++), name(name), alter(alter)
{
}

kunde::kunde(const kunde& orig)
    : knr(MaxKnr++), name(orig.name), alter(orig.alter)
{
}

kunde::kunde(kunde&& orig)
    : knr(MaxKnr++), name(std::move(orig.name)), alter(orig.alter)
{
}

kunde& kunde::operator=(const kunde& rhs)
{
    if (&rhs != this)
    {
        name = rhs.name;
        alter = rhs.alter;
        // CAN'T BE DONE, SO IGNORE IT
        // knr = rhs.knr;
    }
    return *this;
}

kunde& kunde::operator=(kunde&& rhs)
{
    name = std::move(rhs.name);
    alter = rhs.alter;
    // CAN'T BE DONE, SO IGNORE IT
    // knr = rhs.knr;
    return *this;
}

推荐阅读