【问题标题】:vector of char (*)[] castschar (*)[] 类型转换的向量
【发布时间】:2013-08-13 20:47:14
【问题描述】:

我正在处理一些遗留代码,我需要一个 StoreStrings 类存储 一些字符串并能够返回一个 MyString*。

我试过这个:

typedef char MyString[64]; 

class StoreStrings{
public: 
    void store(MyString *aStr)
    {
        theVec.push_back(aStr);
    }
    const MyString* get(){return theVec.begin();} 
private: 
    std::vector<MyString> theVec;
};

但我很失望,因为它不能用这种语法编译。

StoreStrings myStore;

myStore.store("Hello");//cannot convert parameter 1 from 'char [6]' to 'char (*)[64]'

我必须先实例化一个 MyString。

MyString myStr = "Hello";
myStore.store(&myStr);

如何重写 StoreStrings 类以便拥有 myStore.store("Hello");编译?

【问题讨论】:

  • @RahulTripathi 那不是 C# 吗?
  • @rahul 我尝试了几个可能的解决方案,即使使用 string.c_str() 你能拿出一段 c++ 代码吗?
  • char mystring[64] 是 not 可变长度 C 字符串的声明。 “你好”没有 64 个字符。请改用 const char* 或 std::string。
  • MyString 是遗留的一部分,并不打算成为可变大小。 64 只是假定字符串的最大大小。
  • void store(MyString aStr),MyString 已经是一个字符,你也将 theVec 定义为 vector 而你正在尝试插入 MyString*

标签: c++ arrays vector char


【解决方案1】:

数组不能在 STL 容器中使用,因为它要求类型是可复制构造和可分配的

您可以尝试关注,但std::string 方法是最好的。

typedef char MyString[64];

struct X{
 MyString s;
};

class StoreStrings{
public: 
    void store(MyString aStr)
    {  
        X temp ; 
        for(int i=0;aStr[i];++i)
          temp.s[i] =*(aStr+i);
        theVec.push_back(temp); 
    }
   // Here iterator is returned.
   const std::vector<X>::iterator get(){return theVec.begin();} 
private: 
    std::vector<X> theVec;
};

int main(){
    StoreStrings myStore;
    MyString m ="Hello";
    myStore.store(m);
}

【讨论】:

  • 这条线对我有帮助吗? const MyString* get2(){return static_cast ((void*) &*theVec.begin());} 即我可以假设 X 的大小与 MyString 相同吗?
  • 我建议用 strncpy(myTemp1.s,aFirst,sizeof(FMRtyLongString)); 编辑 for 循环这有意义吗?
  • 为什么是 struct X{ MyString s;};复制可构造和可分配?为什么 MyString 不是?
  • @jimifiki 使用数组跟随将不起作用:int x[5]; int y[5]; x=y;
  • 谢谢!我刚刚在这里读到stackoverflow.com/questions/2241699/…,一般来说,给定 struct X d1, d2; d2 = d1;相当于 memcpy(&d2, &d1, sizeof d2)。这完成了我的问题的答案;-)
【解决方案2】:

我会建议类似的东西

Storestring.h

#pragma once
#include <vector>
class StoreStrings
{
public: 
void store(const char* aStr)
{
  pszStr = new char[64];
  strcpy_s(pszStr,64,aStr);
    theVec.push_back(pszStr);
};
~StoreStrings(void){
for(std::vector<char*>::iterator it = theVec.begin();it!=theVec.end();++it){
 delete *it;  
}
};

std::vector<char*>::iterator getBegin(){return theVec.begin();};
std::vector<char*>::iterator getEnd(){return theVec.end();};
private: 
char* pszStr;
std::vector<char*> theVec;
};

main.cpp

#include "StoreStrings.h"
#include <iostream>
int main(void){
StoreStrings s;
s.store("a");
s.store("b");
s.store("c");
for(std::vector<char*>::iterator it = s.getBegin();it!=s.getEnd();++it){
    std::cout << *it<<std::endl;
}
return 0;
};

【讨论】:

  • 我也是,我也在尝试类似的东西。我仍然得到“无法将参数 1 从 'char *' 转换为 'const char (&)[64]'”它是否与您的编译器一起编译?
  • 我并没有真正检查我的建议。现在我对其进行了编辑,它确实可以编译和工作
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2014-03-10
  • 2017-05-30
相关资源
最近更新 更多