将arguments数组赋给头文件中定义的类属性(数组)

时间:2015-12-27 13:34:38

标签: c++ linux

我是C ++的新手,想要实现非常简单的东西,但它不会让我失望。我已经阅读了很多方法来“分配”或“链接”或“复制”数组,但这些方法似乎都没有。

请考虑以下事项:

文件中的

header.h

using namespace std;

Class Proc
{
    public: static char args;
};
文件中的

main.cpp

using namespace std;

#include <cstdlib>
#include <memory>
#include "header.h"

int main(int argc, char* argv[])
{
    Proc::args = argv;                // yea i know this won't work :(
    // Proc::args[argc] = argv;       // not working either
    // memcpy(argv, Proc::args, sizeof(argv));   // nope
    // copy(begin(argv), end(argv), begin(Proc.args));   // nope
}

实际上我根本不想“复制”它,链接它很好,但是g ++编译器一直在我面前喋喋不休undefined reference to 'Proc::args'谁知道还有什么。

我准备在我耳边钻,有人可以举个例子吗?

它不同于undefined reference to'Proc :: args'because I also get:错误:无效使用限定名称'Proc :: args'and also that it complains about char ** & char * not being the same... - and when I add an asterisk to Proc's char * args`然后它会抛出更多。

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望将命令行参数复制到某个变量中。

这是一种方法,即复制。也可以在原始数据上保存指针,但通常不值得努力。

struct Proc
{
   std::vector<std::string> args;
   Proc( int argc, char* argv[] )
   {
      for( size_t i=0; i<(size_t)argc; ++i )
         args.push_back( argv[i] );
   }
};

int main(int argc, char* argv[])
{
    Proc cla( argc, argv ); // saves cl args into variable
    for( const auto& c: cla.args ) // print out
      std::cout << c << "\n";
}

Live here

附注:我不同意@ Sri.U的回答,不推荐在现代C ++中使用memcpy。同样,由于库提供了更安全的容器(stringvector),因此也不鼓励使用原始数组。

答案 1 :(得分:1)

我认为您展示的示例代码中存在两个问题: -

  1. 静态应该在声明之后初始化,在类之外,如 -
  2. char Proc::args = '\0';
    
    int main(int argc, char* argv[]) 
    {
      //Proc::args = argv; /* invalid conversion */
    
      return 0;
    }
    

    这将解决您未定义的引用问题。

    1. 您正在通过Proc::args = argv;进行从char **到char的无效转换,您可以使用static char **args代替。

答案 2 :(得分:0)

你可以:

public: static char args[NUM_ARGS][STRING_LENGTH];


然后你可以对每个参数进行memcpy,如下所示:

for (i=0; i < argc; i++) {
    memcpy (argv[i], args[i], sizeof(argv[i])):
}


main函数argv中的参数是char指针数组。所以你有argc字符串数。

所以而不是

public: static char args[NUM_ARGS][STRING_LENGTH];

你也可以有一些指针数组,并在main中分配如下:

public: static char *args[STRING_LENGTH];


根据OP评论进行编辑: 如果你只想将它分配给args,那么你需要

public: static char **args;

答案 3 :(得分:0)

非常感谢大家的投入!

使用你教给我的东西,我是&#34; frankensteined&#34;答案&amp;一起评论并提出了一个有效的解决方案(下)

我希望这对某人有所帮助,并再次非常感谢你的所有努力。 请随意缩短代码,或使其更优雅。

文件中的

header.h

using namespace std;

class Proc
{
    public: static char** args;

    public: static void init(char* args[])
    {
        Proc::args = args;
    };
};

char **Proc::args;   // important!
文件中的

:main.cpp:

using namespace std;

#include <iostream>

int main(int argc, char* argv[])
{
    Proc::init(argv);
    cout << Proc::args[0];    // works !!
}