我在StackOverflow上看到过类似的问题,但似乎没有一个适用于我。
这是我的代码:
Option.cpp
#include "Option.h"
Option::Option(string valueName, string description, OptionType type){
this->valueName = valueName;
this->description = description;
this->type = type;
};
Option.h
#include <iostream>
using namespace std;
enum OptionType { FLAG, REQUIRED, NORMAL };
class Option {
string valueName, description, value;
OptionType type;
public:
Option(string valueName, string description, OptionType type);
void setValue(string value) {
this->value = value;
};
string getValueName() {
return this->valueName;
};
string getDescription() {
return this->description;
};
OptionType getType() {
return this->type;
};
};
Options.cpp
#include "Options.h"
using namespace std;
Options::Options(int _argc, const char * _argv[]) : argv(_argv) {
this->argc = _argc;
}
Options::~Options() {
options.~unordered_map();
}
void Options::printHelp() {
for (auto &i : options) {
cout << i.first << '\t' << i.second.getDescription() << '\n';
}
}
void Options::addFlag(string flagName, string description) {
}
void Options::addOption(string optionName, string valueName, string description, OptionType type) {
Option option(valueName, description, type);
options[optionName]=option;
}
void Options::addOptionAlias(string aliasName, string optionName) {
}
Options.h
#include <iostream>
#include <unordered_map>
#include "Option.h"
using namespace std;
class Options {
unordered_map<string, Option> options;
int argc;
const char ** argv;
public:
Options(int argc, const char * argv[]);
~Options();
void parse();
void addOption(string optionName, string valueName, string description, OptionType type);
void addFlag(string flagName, string description);
void addOptionAlias(string aliasName, string optionName);
void getOption(string optionName);
void printHelp();
};
在Option option(valueName, description, type);
行的options.cpp中,错误似乎源于此,但对于我的生活,我无法弄清楚原因。据我所知,Option中的构造函数采用了正确的类型。
答案 0 :(得分:10)
问题实际上在下一行:
options[optionName]=option;
首先调用地图中的operator[]
,搜索给定的键并返回关联的值。如果未找到密钥,则会插入连接到该密钥的默认初始化值。然后,此值将随您的选项一起分配。
你看到了问题吗?您的Option
类没有默认构造函数,因此无法进行默认初始化!仔细阅读您的错误消息,肯定是在讨论默认构造函数,而不是您正在查看的构造函数。
您有多种解决方案。最简单的方法是为您的类编写默认构造函数。
替代方法是永远不要在地图中使用operator[]
,以便永远不需要默认构造函数。如果这是你想要做的,插入你写的项目:
options.insert(std::make_pair(optionName, option));
最后,如果您正在使用C ++ 11(或更高版本)以及兼容性足够的编译器,您甚至可以直接将对象构建到容器中:零复制开销,您甚至不需要复制构造函数!
options.emplace(std::piecewise_construct,
std::forward_as_tuple(optionName),
std::forward_as_tuple(valueName, description, type));
答案 1 :(得分:3)
标题中构造函数的声明与源文件中的定义之间存在不匹配。
在标题中......
Option(string& valueName, string& description, OptionType& type);
在源文件中......
Option::Option(string valueName, string description, OptionType type){
请注意,参数在标题中定义为引用(例如字符串&amp; ),但在源代码中定义为对象(例如字符串)。