C++ Вложенные классы, сводящие меня с ума

Я не слишком знаком с r, мой алгоритм должен работать независимо от этого. Вы хотите сдвинуть строку до строки 2n-1. Я хотел бы создать второй массив и вручную разместить их в определенных индексах.

какой-то псевдокод для вас (я обычно пишу на python, так что мой псевдо-код показывает его)

reinsert(list):
   array_out = [len(list)*2,len(list[0]) // initialize to the desired dimensions 
   array_out[0] = list[0]  /// manually insert first row cause math
   for n in range(0,len(list)):
      array_out[2n-1] = list[n] 
      array_out[2n] = event_rinkside // make a function call or make an ifthen clause to do you logic
   return(array_out)

вы можете вставить вновь созданные строки в цикл или добавить их после того, как факт, зная, что они все будут по четным индексам.

12
задан Don Kirkby 16 November 2008 в 06:02
поделиться

5 ответов

Добавьте несколько конструкторов и указатель на родительский класс.

#include <string>
#include <vector>
class myList
{
public:
    std::vector<std::string> vec;
    myList(): items(this) {} // Added
    class Items
    {
    public:
        Items(myList *ml): self(ml) {}  // Added
        void Add(std::string str)
        {
                self->vec.push_back(str); // Changed
        };
        myList *self; //Added
    }items;
};

int main()
{
    myList newList;
    newList.items.Add("A");
}

Вам нужен myList () конструктор, таким образом, он регистрирует экземпляры себя с экземпляром внутренней членской переменной класса. Затем Вам нужен конструктор Объектов для хранения указателя на внешний myList экземпляр класса. Наконец в Добавить методе, необходимо сослаться на vec в сохраненном myList экземпляре.

Как Catskul указывает, конструктор Объекта ничего не должен на самом деле делать с myList указателем, который он получает. Я также хотел бы сказать, что, хотя этот ответ ближе к исходному намерению, ответ steveth45 ближе к тому, что Вы хотели бы сделать в реальной программе.

15
ответ дан 2 December 2019 в 04:26
поделиться

Внутренние классы только связаны по имени. Вы не можете обратиться к вектору в базовом классе как этот.

Или необходимо переместить вектор в к внутреннему классу или сохранить ссылку на него.

2
ответ дан 2 December 2019 в 04:26
поделиться

В отличие от Java, внутренние объекты в C++ не имеют доступа к внешнему 'этим' указателем..., если Вы думаете об этом могут быть случаи, где нет к ссылке.

Решение Richard Quirk является ближайшим, можно войти в C++

5
ответ дан 2 December 2019 в 04:26
поделиться

Таким образом, Вы не подвергаете своих участников класса непосредственно. Ваш пример кажется сверхспроектированным немного. Почему помещенный станд.:: вектор в класс и затем выставляет его как общественность?

class myList
{
private:
    std::vector<std::string> vec;
public:
    void Add(std::string str)
    {
        vec.push_back(str);
    };
};

int main()
{
    myList newList;
    newList.Add("A");
}
11
ответ дан 2 December 2019 в 04:26
поделиться

Вы можете упростить это с помощью следующей конструкции:

typedef std::vector<std::string> myList;

Действительно, почему бы вам не использовать STL вектор напрямую? Таким образом, вы получите все стандартные алгоритмы, работающие с данные.

0
ответ дан 2 December 2019 в 04:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: