#c #class
#c #класс
Вопрос:
Я пытаюсь создать что-то, чтобы определить контейнер для хранения для любого подкласса Tag
; т.е. TAG_String
в коде в следующих файлах:
main.cpp
#include <iostream>
#include "Tag.h"
using namespace std;
int main() {
nbt::TAG_Compound d("Data");
d["str"] = new nbt::TAG_String("str");
d["str"].value("hi");
cout << d["str"].value() << endl;
//cout << val() << endl;
return 0;
}
Tag.cpp
#include "Tag.h"
using namespace std;
nbt::Tag::Tag(string nam){
name = nam;
}
/*nbt::Tagamp; nbt::Tag::operator=(nbt::Tagamp; nw){
nbt::Tag *tis = this;
tis = nw;
return tisamp;;
}*/
string nbt::Tag::Name(){
return name;
}
void nbt::Tag::Name(string nam){
name = nam;
}
void nbt::TAG_Compound::load(string file){
}
void nbt::TAG_Compound::save(string file){
}
nbt::Tagamp; nbt::TAG_Compound::operator[](string lookup){
for(int i=0;i<val.size();i ){
if(val[i].Name() == lookup){
return val[i];
}
}
nbt::Tag tag("");
val.push_back(tag);
return val[val.size()-1];
}
void nbt::TAG_String::load(string file){
}
void nbt::TAG_String::save(string file){
}
string nbt::TAG_String::value(){
return val;
}
void nbt::TAG_String::value(string v){
val = v;
}
(В этом я знаю, что есть пустые функции; они будут использоваться позже)
Tag.h
#ifndef NBTTAG_H_INCLUDED
#define NBTTAG_H_INCLUDED
#include <string>
#include <vector>
namespace nbt{
class Tag {
std::string name;
public:
//void save(std::string);
//void load(std::string);
std::string Name();
void Name(std::string);
Tag(std::string);
//Tagamp; operator=(Tagamp;);
};
class TAG_Compound : public Tag {
std::vector<Tag> val;
public:
void save(std::string);
void load(std::string);
Tagamp; operator[](std::string);
using Tag::Tag;
};
class TAG_String : public Tag {
std::string val;
public:
void save(std::string);
void load(std::string);
std::string value();
void value(std::string);
using Tag::Tag;
};
}
#endif // NBTTAG_H_INCLUDED
Есть ли вообще способ? (Я убежден, что есть, поэтому, если кто-нибудь может доказать мне, что это было бы хорошо.)
Комментарии:
1. В чем ваша проблема? На данный момент я вообще не могу сказать.
2. Вы должны использовать
const std::stringamp;
вместо простоstd::string
как параметры для своих функций, это позволит избежать ненужного копирования.
Ответ №1:
Создайте класс, который содержит ссылку на класс тегов, например, следующим образом:
class Container {
public:
Container( Tag *tag ) {
containedTag = tag;
}
Tag *containedTag;
};
Затем создайте его следующим образом:
TAG_String tag = TAG_String( "String!" );
Container container = Container( amp;tag );
Я заметил, что вы пытались сделать что-то подобное с классом TAG_Compound , однако вектор принимает только значения тегов и вместо этого должен принимать указатель или ссылку. Помните, что в C вы можете передать экземпляр дочернего класса как экземпляр его родительского класса, только если вы передаете ссылку или указатель на него, вы не можете фактически сделать его экземпляром родительского класса.
Комментарии:
1. Я пытался заставить его использовать
Tag*
, но это привело к сбою. Я не пыталсяTagamp;
, хотя. Я попробую это.2. не сработало. Получено 31 ошибка. Полагаю, мне следовало упомянуть, что я использую C 11. Пытаюсь определить функцию аналогичным образом.
3. щенок. это сработало. Теперь мне просто нужно использовать определенные функции, для
TAG_String
которых, конечно, не работает.4. Обычно в объектно-ориентированной настройке вы используете базовые методы базового объекта, чтобы возвращать или обрабатывать все необходимое. Это все о дизайне интерфейса, и поэтому вы можете посмотреть некоторые учебные пособия по объектно-ориентированному проектированию, например oodesign.com
5. Я разработал способ сделать это с помощью
virtual
функций.