gpt4 book ai didi

c++ - 从 std::string 类继承时跳过添加构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:00 24 4
gpt4 key购买 nike

尝试对 std::string 进行参数化,使其支持方法“bool operator==(int)”。我有错误:

$ g++ -std=c++11 te2.cc
te2.cc: In function ‘int main(int, char**)’:
te2.cc:20:20: error: no matching function for call to ‘mstring::mstring(const char [4])’
te2.cc:20:20: note: candidates are:
te2.cc:10:7: note: mstring::mstring()
te2.cc:10:7: note: candidate expects 0 arguments, 1 provided
te2.cc:10:7: note: mstring::mstring(const mstring&)
te2.cc:10:7: note: no known conversion for argument 1 from ‘const char [4]’ to ‘const mstring&’
te2.cc:10:7: note: mstring::mstring(mstring&&)
te2.cc:10:7: note: no known conversion for argument 1 from ‘const char [4]’ to ‘mstring&&’

这是简单的来源:

#include <unordered_map>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;


class mstring : public string {
public:
//mstring (char* p) : std::string(p) {};
bool operator == (int x) {
int n = atoi(this->c_str());
return (n == x);
}
};

int main(int argc, char *argv[])
{
mstring t("123");
if (t == atoi(argv[1])) {
printf("yes\n");
} else {
printf("no\n");
}
}

如果我取消注释构造函数 /mstring (char* p) : std::string(p) {};,那么它会编译并运行良好。

问题是,如果可以在不为 mstring 定义构造函数的情况下使其工作,只需使用基类的任何构造函数(反正没有新的数据成员)?谢谢。

最佳答案

如何提供一个独立的运算符函数而不是从 std::string 继承(这使得该代码整体上更有用):

bool operator==(const std::string& s, int i) {
int n = atoi(s.c_str());
return (n == i);
}

bool operator==(int i, const std::string& s) {
return s == i;
}

或者更通用:

template<typename T>
bool operator==(const std::string& s, T t) {
std::istringstream iss;
iss << t;
return (s == iss.str());
}

std 命名空间中的类不打算被继承,而只是用于接口(interface)和函数参数。从这些类继承会降低您的代码的可用性,因为客户需要使用您的实现而不是仅仅使用 std 类型。


另请注意:对于您的特定用例,根本不需要转换任何内容,除非您想断言 argv[1] 包含一个数字(其中 atoi() 当然不是这样做的最佳方法,而是查找 stoi())。您可以只比较字符串:

if (std::string("123") == argv[1]) {
printf("yes\n");
} else {
printf("no\n");
}

关于c++ - 从 std::string 类继承时跳过添加构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com