Wektor obiektów - jak utworzyć wskaźnik w innej klasie?

0

Witam,
W jaki sposób mogę utworzyć wskaźnik do wektora TableList <Column>, który istnieje w klasie Table, z poziomu klasy Column (każda klasa w osobnym pliku), bez "zawierania przyjaźni"? Chodzi o to, że chciałbym stworzyć obiekt klasy Column, np. kolumna1, i ten sam obiekt umieścić w TableList (obecnie, przy tworzeniu kolumna1, do TableList dodaję nowy element i później inicjuję wskaźniki, np. name_ptr = &TableList[index].name ).

Poniżej wspomniane klasy.

class Table {
			friend class Column;
		public:
			Table(const std::string&);
			std::vector<Column> TableList;
	};

class Column {
			friend class Table;
			std::string * name_ptr;
			std::vector<std::string> * row_ptr;
		public:
			Column(Table *, const std::string&);
			std::string name;
			std::vector<std::string> row;
	};
0

Albo nie rozumiem Twojego pomysłu, albo design masz do bani. Postaraj się opisać problem upewniając się, że poprawnie używasz pojęć klasa i obiekt, a także przedstaw co chciałbyś osiągnąć (czyli jak używać kodu), a nie tylko rozwiązanie, które uznajesz za nieprawidłowe.

0

Chciałbym, żeby name w Column było wskaźnikiem do name w TableList (TableList[i].name) -- (albo odwrotnie, ale nie wiem, czy wartość wskaźnika się zachowa, jeżeli obiekt Column przestanie istnieć, np. std::vector<*Column> TableList) -- bez używania "friend class", którego nie potrzebuję. Obecnie kod, który to wykorzystuje wygląda tak:

Column::Column(Table * table, ...) : TableName(table->name) {
	size_t table_size = table->TableList[TableName].size();
	table->TableList[TableName].reserve(table_size + 1);
	name_ptr = &table->TableList[TableName][table_size].name;
	row_ptr = &table->TableList[TableName][table_size].row;
	*name_ptr = "ABC";
}
0

jak zmieni się rozmiar TableList to wskaźniki do jej elementów będą nieważne

1

naming convention jest tak dezorientujący, że nikt kto to czyta nie zrozumie o co Ci chodzi, ja np. nie dałem rady

1

Nie wystarczy po prostu:

class Column 
{
public:
    std::string name;
    std::vector<std::string> row;
 
    Column(std::string name_) 
        :name(std::move(name_))
    { }
};
 
class Table 
{
    std::vector<std::unique_ptr<Column>> TableList;
public:
     /* ... */

     Column* getColumn(size_t i) const
     {
          return i < TableList.size() ? TableList[i].get() : nullptr;
     }

    Column* addColumn(std::string name)
    {
        TableList.push_back(std::make_unique<Column>(std::move(name)));
        return TableList.back().get();
    }
}; 

?

1 użytkowników online, w tym zalogowanych: 0, gości: 1