字符指针数组的向量强制转换

3

我正在处理一些老代码,我需要一个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#吧? - Bernhard Barker
@rahul 我已经尝试了几种可能的解决方案,甚至使用了string.c_str()。你能写出一段C++代码吗? - jimifiki
char mystring[64] 不是一个可变长度的 C 字符串的声明。而且 "hello" 并不具有 64 个字符。请使用 const char* 或 std::string。 - Hans Passant
MyString是遗留代码的一部分,不打算具有可变大小。64只是假定字符串可能具有的最大大小。 - jimifiki
void store(MyString aStr)中,MyString已经是char类型,同时您将theVec定义为vector<MyString>,而您正在尝试插入MyString*。 - aamir
2个回答

1
我建议这样做。

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]'”这个错误。您的编译器可以通过编译吗? - jimifiki
我之前没有真正检查过我的建议。现在我已经进行了编辑,它可以编译并且运行。 - okaerin

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<MyString*> ((void*) &*theVec.begin());}也就是说,我能否假设X和MyString具有相同的大小? - jimifiki
我建议使用以下代码编辑for循环:strncpy(myTemp1.s,aFirst,sizeof(FMRtyLongString)); 这个意思清楚吗? - jimifiki
为什么结构体X{ MyString s;};是可复制构造和可赋值的?而MyString不是? - jimifiki
1
@jimifiki 使用以下数组是行不通的:int x[5]; int y[5]; x=y; - P0W
谢谢!我刚刚在这里阅读了https://dev59.com/nkvSa4cB1Zd3GeqPiOc4,一般来说,给定结构体X d1,d2; d2 = d1;相当于memcpy(&d2, &d1, sizeof d2)。这完整回答了我的问题;-) - jimifiki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接