Создайте класс StringVector, производный от vector<void*>

helloy

Создайте класс StringVector, производный от vector. Переопределите функции push_back() и operator[] так, чтобы они принимали и возвращали string*.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
class StringVector: public vector<void*> {
public:
  StringVector(){}
  string* push_back(string*str){
      vector<void*>::push_back(str);
  }
 
  string*operator[](string*str){
  
  }
};
 
 
int main() {
    StringVector base;
 
}
как дальше?
5 ответов

helloy

Насколько я знаю push_back не должно возвращать значения И опишите конкретно что не получается.


helloy

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
 
class StringVector: public vector<void*> {
public:
  string* push(string*str){
      vector<void*>::push_back(str);
  }
 
  string*operator[](int index){
      return (string*)vector<void*>::operator[](index);
  }
  ~StringVector(){
      vector<void*>::clear();
  }
 
};
 
 
int main() {
    ifstream in("25.cpp");
    StringVector base;
    string line;
    while(getline(in,line)) base.push_back(new string(line));
    for(int i=0;i<base.size();i++){cout<<*base[i]<<endl;}
 
}
пока дождёшься...or
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
 
class StringVector: public std::vector<void*> {
public:
  std::string* push(std::string*str){
      vector<void*>::push_back(str);
  }
 
  std::string*operator[](int index){
      return (std::string*)std::vector<void*>::operator[](index);
  }
  ~StringVector(){
      vector<void*>::clear();
  }
 
};
 
 
int main() {
    std::ifstream in("25.cpp");
    StringVector base;
    std::string line;
    while(std::getline(in,line))
        base.push_back(new std::string(line));
    for(int i=0;i<base.size();++i)
        std::cout<<*base[i]<<std::endl;
 
}


helloy

Насколько я знаю push_back не должно возвращать значения
Все верно:
void push_back(const _Tp& __x)...


helloy

push_back не должно возвращать значения
Думаю автор имел вот что:
//...
std::string* push(std::string*str){
     vector<void*>::push_back(str);
      return (std::string*)vector<void*>::back();
  }
//...
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
 
class StringVector: public std::vector<void*> {
public:
  std::string* push(std::string*str){
     vector<void*>::push_back(str);
      return (std::string*)vector<void*>::back();
  }
 
  std::string*operator[](int index){
      return (std::string*)std::vector<void*>::operator[](index);
  }
  ~StringVector(){
      vector<void*>::clear();
  }
 
};
 
 
int main() {
    std::ifstream in("25.cpp");
    StringVector base;
    std::string line;
    while(std::getline(in,line))
        std::cout<<*base.push(new std::string(line))<<std::endl;
    
 
}
Конечный результат:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
 
class StringVector: public std::vector<void*> {
public:
  std::string* push(std::string*str){
     vector<void*>::push_back(str);
      return (std::string*)vector<void*>::back();
  }
 
  std::string*operator[](std::string*str){
      for(int i=0;i<int(std::vector<void*>::size());++i)
          if (*(std::string*)std::vector<void*>::operator[](i)==*str){
            return (std::string*)std::vector<void*>::operator[](i);
          }
        return 0;
  }
  ~StringVector(){
      vector<void*>::clear();
  }
 
};
 
 
int main() {
//hello
    std::ifstream in("MY.cpp");
    StringVector base;
    std::string line;
    while(std::getline(in,line))
        std::cout<<*base.push(new std::string(line))<<std::endl;
    std::cout<<base[new std::string("//hello")];
    
 
}


helloy

Так как ваш класс унаследован от vector то можно использовать запись в push_back:
this->push_back и значение.
И все равно возвращать значение после того как его туда пометили бессмысленно