Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串连接不使用';I don’我没有按预期工作_C++ - Fatal编程技术网

C++ 字符串连接不使用';I don’我没有按预期工作

C++ 字符串连接不使用';I don’我没有按预期工作,c++,C++,(win7;gcc 4.8.2(cygwin)) 下面的代码片段生成计数错误指针\\,而不是(“指针”)。我能做些什么来得到正确的结果吗 virtual string toString() const { return "Pointer"; } virtual string write() const { string str = "( " + '"' + toString() + '"' + " )"; return str; }; 首先,让

(win7;gcc 4.8.2(cygwin))

下面的代码片段生成
计数错误指针\\
,而不是
(“指针”)
。我能做些什么来得到正确的结果吗

  virtual string toString() const { 
     return "Pointer";
  }
  virtual string write() const {
     string str = "( " + '"' + toString() + '"' + " )";
     return str;
  }; 

首先,让我们澄清一些事情:

+-------------+----------------+-----------------------+
| Expression  | Type           | Type as operator arg  |
+-------------+----------------+-----------------------+
|  toString() |  std::string   |  std::string          |
|  "( "       |  char const[3] |  char const*          |
|  '"'        |  char          |  char                 |
+-------------+----------------+-----------------------+
这些并非都是“字符串”。

这里的主要问题是,
”(“+”
没有做您认为它做的事情。”添加“一个
char
到一个
const char*
并不会生成一个更大的字符串;它会向字符串文本的指针值添加一个数字。在这个过程中,你会创建一个新的指针,指向……嗯……没有任何用处。事实上,你通过增加指针来调用未定义的行为

有点像这样:

char const* whatYouAreDoing()
{
   char const* a = "( ";
   char b = '"';

   int c = b;
   assert(c == 34);  // assuming ASCII 
   a += c;           // whoops!

   return a;         // this pointer is now nonsense
}
通常,如果要“构建”字符串,可以使用流格式:

virtual string write() const
{
   std::stringstream ss;
   ss << "( " << '"' << toString() << '"' << " )";
   return ss.str();
}

首先,让我们澄清一些事情:

+-------------+----------------+-----------------------+
| Expression  | Type           | Type as operator arg  |
+-------------+----------------+-----------------------+
|  toString() |  std::string   |  std::string          |
|  "( "       |  char const[3] |  char const*          |
|  '"'        |  char          |  char                 |
+-------------+----------------+-----------------------+
这些并非都是“字符串”。

这里的主要问题是,
”(“+”
没有做您认为它做的事情。”添加“一个
char
到一个
const char*
并不会生成一个更大的字符串;它会向字符串文本的指针值添加一个数字。在这个过程中,你会创建一个新的指针,指向……嗯……没有任何用处。事实上,你通过增加指针来调用未定义的行为

有点像这样:

char const* whatYouAreDoing()
{
   char const* a = "( ";
   char b = '"';

   int c = b;
   assert(c == 34);  // assuming ASCII 
   a += c;           // whoops!

   return a;         // this pointer is now nonsense
}
通常,如果要“构建”字符串,可以使用流格式:

virtual string write() const
{
   std::stringstream ss;
   ss << "( " << '"' << toString() << '"' << " )";
   return ss.str();
}

您应该使用字符串作为第一个求和符,为了安全起见,您还需要一些大括号。确保所有求和符都是字符串(可能在转换后)

好的,这并不完全正确,如果存在这样的情况,像
+(std::string&,consts char*)
这样的运算符也可以。但是,我希望您能理解。您必须确保使用了预期的
+
-操作,即
字符串
-类中的那些操作

请参见以下示例:

#include <string>
#include <iostream>

using namespace std;

string toString() { 
    return "Pointer";
}
string write() {
    string str = string("( ") + '"' + (toString() + '"') + " )";
    return str;
};

int main()
{
    std::cout << "Test:>>" << write() << "<<\n";
  return 0;
}
#包括
#包括
使用名称空间std;
字符串toString(){
返回“指针”;
}
字符串写入(){
string str=string(“(”+“+””+(toString()+“)+”)”;
返回str;
};
int main()
{

std::cout您应该使用一个字符串作为第一个summand,为了安全起见,您还需要一些大括号。确保所有summand都是字符串(可能在转换之后)

好的,这并不完全正确,如果存在这样的情况,像
+(std::string&,consts char*)
这样的运算符也可以。但是,我希望您能理解。您必须确保使用了预期的
+
-操作,即
字符串
-类中的那些操作

请参见以下示例:

#include <string>
#include <iostream>

using namespace std;

string toString() { 
    return "Pointer";
}
string write() {
    string str = string("( ") + '"' + (toString() + '"') + " )";
    return str;
};

int main()
{
    std::cout << "Test:>>" << write() << "<<\n";
  return 0;
}
#包括
#包括
使用名称空间std;
字符串toString(){
返回“指针”;
}
字符串写入(){
string str=string(“(”+“+””+(toString()+“)+”)”;
返回str;
};
int main()
{

std::cout是什么导致了这个错误?编译器?运行时?是否有可能有一个派生类型正在重写这两个方法之一?@Smac89:No,
toString()
应该是
const
。不确定为什么建议将其设置为非
const
,尤其是因为这与手头的问题无关。是什么导致了该错误?编译器?运行时?是否有可能存在一个派生类型正在重写这两种方法之一?@Smac89:No,
toString()
应该是
常量
。我不知道你为什么建议将其设为非
常量
,尤其是因为这与手头的问题无关。你必须重新标记
”(“
不是类型
std::string
,而是类型
常量字符*
”“
char
类型,因此您将增加指针
const char*
。这不是您想要的。@sleepy42:事实上,字符串文本具有类型
char const[N]
。除此之外,现在更清楚了吗?完全正确(但在本例中,
const char[3]
”()
应该转换成
常量字符*
,因为这样就可以使用
操作符+
。@sleepy42:是的,正如我的回答所说。你必须重新标记
”(“
不是类型
std::string
,而是类型
常量字符*
”“
char
类型,因此您将增加指针
const char*
。这不是您想要的。@sleepy42:事实上,字符串文本具有类型
char const[N]
。除此之外,现在更清楚了吗?完全正确(但在本例中,
const char[3]
”()
应该转换成
常量字符*
,因为这样就可以使用
操作符+
。@sleepy42:是的,正如我的回答所说。