Передача char ** в качестве ссылки и возвращение const char * в качестве ссылки - PullRequest
1 голос
/ 18 сентября 2011

У меня есть класс, который анализирует аргументы командной строки, а затем возвращает проанализированное значение клиентскому классу. Для разбора мне нужно передать argv в функцию разбора. Я хотел бы перейти по ссылке, но, насколько я знаю, мы никогда не используем символ «&» при передаче массивов. Массивы не являются объектами, которые могут быть переданы по ссылке. Вот мой код:

#include <iostream>
#include <fstream> 
using namespace std;

class cmdline
{
    const char * ifile;
    public:

    cmdline():ifile(NULL){}

    const char  * const getFile() const
    {
        return (ifile);
    }

    void parse(int argc,const  char** argv)
    {
        //parse and assign value to ifile 
        //  ifile = optarg;
        // optarg is value got from long_getopt

    }
};

int main(int argc, char ** argv)
{
    cmdline CmdLineObj;
    CmdLineObj.parse(argc, const_cast<const char**>(argv));
    const char * const ifile = CmdLineObj.getFile();
    ifstream myfile (ifile);
    return 0;
}

1) Правильно ли лечится argv?

2) Лучший способ справиться, ifile?

3) Я хочу вернуть ifile в качестве ссылки, какие изменения я должен сделать, если это необходимо?

Мой код работает так, как он должен работать, но причина, по которой я пришел к SO, заключается в том, чтобы "не просто сделать это", а сделать это правильно.

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ :: После комментария Мехрдада я отредактировал так:

class CmdLine
{
    const char *  ifile;

public:
    const  char  * & getFile() const
    {
        return (ifile);
    }

Но я получаю ошибку - неверная инициализация ссылки типа "const char * &" из выражения типа "const char"

1 Ответ

0 голосов
/ 18 сентября 2011

Массивы не являются объектами, которые могут быть переданы по ссылке.

Почему вы так думаете?

1) Как обрабатывается argv,правильно?

CmdLineObj.parse (argc, const_cast (argv));

Почему вы используете этот const?Вместо разыгрывания вы можете изменить определение main на const char** argv.

2) Лучший способ справиться, если он есть?

Ну, всегда естьstd::string, но так как все, что вы, похоже, делаете, это передаете значение в std::ifstream. Я не вижу смысла в его использовании.

3) Я хочу вернуть ifile в качестве ссылкиКакие изменения я должен сделать, если это необходимо?

Какой смысл возвращать указатель в качестве ссылки?Вы ожидаете, что вызывающие getFile действительно изменят член, который указывает на такую ​​строку?Вам не следует этого делать, поскольку getFile является const функцией-членом.Если вы думаете о производительности, то возврат ссылки на указатель в этом случае будет на самом деле хуже, чем возврат указателя по значению.Содержимое строки не копируется при возврате из getFile, как если бы ifile было вместо std::string (в этом случае возвращение константной ссылки имело бы смысл).

...