将参数数组分配给头文件中定义的类属性(数组)

assign arguments array to class property (array) defined in header file

本文关键字:数组 属性 定义 文件 分配 参数      更新时间:2023-10-16

我是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",然后它会抛出更多。

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

有一种方法可以做到这一点,那就是复制。也可以在原始数据上保存指针,但这通常不值得。

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";
}

住在这里

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

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

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

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

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

您可以拥有:

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


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

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


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

所以不是

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


您还可以拥有指针数组,并在main中进行分配,如下所示:

public: static char *args[STRING_LENGTH];


根据OP注释进行编辑:如果你只想把它分配给args,那么你需要有

public: static char **args;

非常感谢大家的投入!

用你教我的,我"弗兰肯斯坦"的答案&评论在一起,并提出了一个可行的解决方案(如下)

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

在文件中: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 !!
}