用 C++ 编写二维地图的三法则

问题描述 投票:0回答:2

我正在制作一个程序来确定一条推文是快乐还是悲伤,我想我对推文进行标记,然后创建一个映射,将单词存储为键,总共使用了多少次,以及使用了多少次它被用在快乐的推文和悲伤的推文中。

我认为这是一个很好的方法,虽然可能有更好的选择,但我不太明白如何为我想创建的地图编写三规则。 Classifier 对象将是用于对推文进行情感分类的对象,下面是 CLassifier.h 文件,不包括训练数据的其他方法(DSString 对象是字符数组)

class Classifier {
private:
  map<DSString, map<char, float>> *words;

public:
  Classifier();
  
  Classifier(const DSString& objToCopy);  // Copy Constructor
  ~Classifier();  // Destructor
  Classifier &operator=(const Classifier& objToCopy);  // Copy Assignment Overload
}

下面是 CLassifier.cpp 文件,不包含用于训练和预测的方法的代码。

using namespace std;

Classifier::Classifier() {
  map<DSString, map<char, float>> *words;
}

// 1/3 Copy Constructor
Classifier::Classifier(const Classifier& objToCopy) {
  words = new map<DSString, map<char, float>>(*objToCopy.words);
}

// 2/3 Destructor
Classifier::~Classifier() {
  delete words;
  words = nullptr;
}

// 3/3 Copy Assignment Operator Overload
Classifier& Classifier::operator=(const Classifier& objToCopy) {
  if (this != &objToCopy) {
    delete words;
    words = new map<DSString, map<char, float>>(*objToCopy.words);
  }
  return *this;
}

当我尝试编译程序时,我收到有关我的复制构造函数的错误消息:

Classifier.cpp:15:51: error: definition of implicitly-declared ‘constexpr Classifier::Classifier(const Classifier&)’
   15 | Classifier::Classifier(const Classifier& objToCopy) {

我做错了什么我无法编译我的程序?如果我错误地使用地图,我可以更改什么以使程序仍然运行?有没有更好/更有效的方法来做到这一点?我需要扫描大约 2 万条推文的 CSV 文件。

c++ copy-constructor deep-copy rule-of-three
2个回答
1
投票

你的头文件有错误。您在复制构造函数中使用了错误的类名。你有这个:

Classifier(const DSString& objToCopy);  // Copy Constructor

应该是这样的:

Classifier(const Classifier& objToCopy);  // Copy Constructor

1
投票

这是你在没有指针的情况下重写的代码(并且修复了错误)

class Classifier {
private:
  map<DSString, map<char, float>> words;

public:
};

这被称为零规则,因为您不需要编写析构函数、复制构造函数或复制赋值运算符。编译器生成的是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.