gpt4 book ai didi

c++ - 正确继承std::string的方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:04 25 4
gpt4 key购买 nike

最近一直想定义一个std::string的子类spstring。它在 spstr.h 中声明:

#include <cctype>
#include <string>
#include <algorithm>
#include <sstream>
#include <stdint.h>
#include <xstring>


class spstring : public std::string {
public:
spstring(std::string s):std::string(s){} //Declare the constructor
int stoi(); //Declare stoi
spstring Spstring(std::string s); ////Declare mandatory conversion function
};

spstring spstring::Spstring(std::string s)
{
spstring spstr(s);
return(spstr);
}

但是,在 main.cpp 中测试时:

spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring
int byteadd;
byteadd=byteaddstr.stoi(); //call byteaddstr.stoi

未能遵守:

error C2228: left of “.stoi” must have class/struct/union

听起来很奇怪,既然byteaddstr确实是spstring的一个实例,为什么不能调用它的成员函数呢?

最佳答案

在 C++ 中,任何可以被解析为函数声明的声明,例如……

    spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring

解析为函数声明。

即不是变量。

在这种特殊情况下,一种解决方案是添加额外的括号:

    spstring byteaddstr(( std::string(argv[4]) )); //convertchar* to spstring

这被称为 C++ 中最令人烦恼的解析,尽管有些人不同意 Scott Meyers 最初对该术语的使用是否像现在使用的那样普遍适用。


顺便说一句,通常应该有很好的理由从 std::stringderive,因为它增加了复杂性和困惑(您可以安全地忽略这些顾虑关于动态分配,因为动态分配 std::string 的代码应该得到它得到的任何东西)。所以,我建议你不要那样做。

关于c++ - 正确继承std::string的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512547/

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