C преобразовать из определенного суперкласса в подкласс, используя =

#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 функций.