奇怪的分配问题 - C ++

时间:2011-09-21 02:23:34

标签: c++ variable-assignment

在GCC编译器中创建新的字符串类并为其分配char*数组时遇到奇怪的问题。源代码:

#include "../Include/StdString.h"

StdString::StdString()
{
    //ctor
    internstr = std::string();
}

char* StdString::operator=(StdString other) {
    return other.cstr();
}

StdString StdString::operator+(StdString other) {
    StdString newstr = StdString();
    newstr.internstr = internstr+other.internstr;
    return newstr;
}

void StdString::operator=(char* other) {
    internstr = other;
}

StdString::~StdString()
{
    //dtor
}

char* StdString::cstr() {
    return (char*)internstr.c_str();
}

错误:从char*转换为请求的非标量类型StdString

std::string如何完成作业?

5 个答案:

答案 0 :(得分:2)

std :: string可以进行转换,因为它定义了conversion constructor。这样的事情。

class std::string {
  // ...
std::string(const char *);
};

注意:实际的std :: string更复杂。

使用赋值运算符,您应该可以

StdString str;
str = "hello";

但不是

StdString str = "hello";

答案 1 :(得分:1)

您遇到的错误是不提供带char*的构造函数。这是编译器抱怨丢失的转换函数。

StdString::StdString(char const* s)
{
    // ...
}

此外,如果您的内部字符串是std::string,那么您不需要任何赋值运算符,复制构造函数和析构函数。添加char*转换构造函数后,编译器提供的赋值运算符也将神奇地用于char*。好吧,不是很神奇:编译器会看到它可以通过转换构造函数将char *转换为StdString,然后将其与隐式赋值运算符一起使用。

您也可以将默认构造函数的定义保留为空;这将为您提供所有成员的默认构造,这可能已经足够了。

答案 2 :(得分:1)

  

StdString mystr =“Hello world!”;

需要复制构造函数。

尝试添加以下内容:

StdString::StdString(const char* other)
{
    internstr = other;
}

答案 3 :(得分:0)

看起来你混淆了分配和初始化。初始化使用构造函数,即使使用“=”符号调用它也是如此。

答案 4 :(得分:0)

为什么要将转换运算符定义为:

char* StdString::operator=(StdString other) 
{ 
    return other.cstr(); 
} 

所有这些确实会返回other的内容而不将当前类的internstr设置为其他类提供的内容。

我会做的更像是:

StdString& StdString::operator=(StdString other) 
{ 
    //  copy contents of other to this->internstr

    return *this;
}