2013-11-14 3 views
0

Я совершенно новичок в C++. Я пытался понять это в течение нескольких дней - это будет легкое решение без сомнения, но я не смог его найти (после многоголоджинга)! Моя проблема заключается в следующем:Как я могу получить доступ к массиву, хранящемуся в объекте?

Я пытаюсь создать класс с функцией-членом, которая читает символы из файла и сохраняет их в массиве. Я хочу иметь возможность создавать несколько объектов (не уверенный, сколько - решил пользователь), каждый со своими собственными массивами, заполненными символами, взятыми из разных файлов. Думаю, мне удалось это сделать. Как я мог бы обратиться к массиву объекта в основном?

Код я работаю долго и неаккуратно, но что-то вдоль этих линий (char.txt содержит просто «12345» в данном случае):

#include <iostream> 
#include <fstream> 

using namespace std; 

class Something{ 

public: 
    void fill_array(char array_to_fill[]){ 
     char next; 
     ifstream input; 
     input.open("chars.txt"); 
     input.get(next); 
     while(!input.eof()) 
     { 
      for(int i = 0; i < 6; i++) 
      { 
      array_to_fill[i] = next; 
      input.get(next); 
      } 
     } 
    } 
}; 

int main() 
{ 
    Something* something = new Something[1]; 
    char array_to_fill[5]; 

    something->fill_array(array_to_fill); 

    //I'd like to be able to access the array here; for example - to cout the array. 

    return 0; 
} 

Извинения, если а) моя терминология не так б) мой код мусор или в) мой вопрос глуп/не имеет смысла. Также я должен добавить, что еще не изучил векторы, и я не должен использовать их для программы, которую я делаю. Любая помощь приветствуется. Ура!

+1

Класс 'Something' не имеет элемента данных массива. Вы заполняете массив, который был создан в 'main'. – 0x499602D2

+0

Итак, чтобы получить доступ к массиву, вы будете делать 'array_to_fill'. Так просто, как если бы вы имели в виду что-то еще. – 0x499602D2

ответ

0

Ваш класс не хранит массив вообще. Это просто держатель для метода. Вероятно, вы хотите что-то вроде этого, где каждый экземпляр класса содержит массив. (Я изменил его std::string, так как они лучше работать.)

class Something 
{ 
    private: 
     std::string data; 

    public: 
     void fill_data(const std::string& filename) 
     { 
      ifstream file(filename); 
      file >> data; 
      file.close(); 
     } 

     std::string get_data() const 
     { 
      return data; 
     } 
} 

int main() 
{ 
    std::vector<Something> my_things; 

    my_things.push_back(Something()); 
    my_things[0].fill_data("chars.txt"); 
    cout << my_things[0].get_data() << std::endl; 

    my_things.push_back(Something()); 
    my_things[1].fill_data("another_file.txt"); 
    cout << my_things[1].get_data() << std::endl; 
} 

Поскольку вы используете C++, а не C, привыкают к написанию C++ код вместо С (std::vector вместо массивов C (для неизвестной длина массивов), std::string вместо char* и т. д.).

+0

Спасибо clcto, я думаю, что ваш ответ - это то, что я искал. Хотя я не буду притворяться, что полностью понимаю это! Я еще не покрыл векторы, но сейчас я попытаюсь справиться с ними. Много учиться! – dlmb

-1

В настоящее время метод fill_array создает локальную копию array_to_fill, поэтому любые изменения, которые вы делаете в array_to_fill, происходят только локальным способом. Чтобы изменить это, перейдите по указателю. Таким образом, указатель копируется вместо всего объекта массива. Я не проверял это, но он должен выглядеть следующим образом:

void fill_array(char* array_to_fill){ 
    ... 
} 

Вам не нужно ничего менять в главном методе.

Чтобы получить доступ к элементам, вы можете использовать [] обозначение. То есть cout << array_to_fill[0] в основном метод.

Редактировать: Я думаю, что изменения должны сработать.

+0

Вы должны были протестировать его ... – 0x499602D2

+0

Не нужно долго его проверять, и я неоднократно использовал ссылки. – Maria

+0

Код не компилируется. Вы не берете массив по ссылке. Он фактически подписан как массив * ссылок *. Вы не можете создать массив ссылок. – 0x499602D2

0

Я думаю, что ваш вопрос слишком общий для формата переполнения стека, но в этом случае вы хотите либо создать публичный элемент, либо создать частный член с сеттерами и геттерами.

class Something 
{ 
public: 
    std::string m_string; 
} 

int main() 
{ 
    Something A; 
    A.m_string = "toto"; 
    cout << A.m_string; 
    return 0; 
} 

Поместите строку для удобства (вы можете использовать const char*, но вы должны понимать, что область, чтобы знать, когда он не будет доступен больше, и вы не совсем там еще) и могут быть опечатки так как я набрал это с телефона.

Если вы действительно хотите получить доступ к самим символам, передайте char * с size_t для длины массива или используйте std :: array, если это возможно.

+0

Он хочет получить элементы массива. Членская переменная в его классе не нужна. Он мог бы сделать метод статическим, если он того пожелает. – Maria

+0

Тогда сделайте это char *, я думаю, он не понимает, что созданная им строка является только локальной областью видимости и позже будет иметь проблемы. – BlueTrin

+0

Да, это точно проблема. Однако это может быть не char []. – Maria

Смежные вопросы