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"); 编译?

4

2 回答 2

1

我会建议类似的东西

存储字符串.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;
};

主文件

#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;
};
于 2013-08-12T14:12:34.983 回答
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);
}
于 2013-08-12T14:28:23.043 回答