2011-09-21 63 views
2

在GCC编译器中创建一个新的字符串类并为其分配一个char*的数组有一个奇怪的问题。源代码:奇怪的赋值问题 - C++

#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是如何做他们的任务?

+0

发生在我设置StdString myStr中=; – IDWMaster

+0

请考虑在这里发布一个最简单的工作示例。 –

+0

你为什么使用pastebin?代码将适合在这里。 –

回答

2

std :: string可以进行转换,因为它定义了一个conversion constructor。像这样的东西。

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

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

随着赋值运算符,你应该能够做到

StdString str; 
str = "hello"; 

但不

StdString str = "hello"; 
+0

如果'StdString'更像'std :: string',那么初始化也必须工作。 'std :: string'有一个重载的构造函数,其参数类型为'const char *'。 [参考](http://www.cplusplus.com/reference/string/string/string/) – Mahesh

+0

谢谢!这原来是解决方案 – IDWMaster

0

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

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; 
} 
1

您遇到的错误是不提供一个构造函数一个char*。这是编译器抱怨缺少的转换函数。

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

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

您也可以保留默认构造函数的定义为空;这会给你所有成员的默认构造,这可能足够好。

1

StdString mystr = "Hello world!";

需要复制构造函数。

尝试添加以下内容: “你好!世界”

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