【问题标题】:what does a const char** look like?const char** 是什么样的?
【发布时间】:2016-08-09 06:39:28
【问题描述】:

我有一个类,它接受主要的命令行参数(例如,-B、-a 等)并用它们做一些事情,但我也希望能够在不传递命令行参数的情况下实例化该函数,比如:

构造函数:

myClass(int argc, const char **argv){
    <initialise class with flags from argv>
}

myClass() : myClass(2, "-B") {}
}

我在这里尝试使用标志“-B”实例化 myClass,但它一直给我错误:

no known conversion for argument 3 from ‘const char [3]’ to ‘const char**’

所以我想知道我需要做什么才能将值作为 const char** 传递?

【问题讨论】:

  • 不是真正的代码。请发布真实代码。目前,投票结束是缺乏例子。
  • 注1:如果你想传递main参数,那么const char **argv类型就不行了。没有从 char**char const** 的隐式转换。
  • 注2:char 的数组(如字面量"-B")不会衰减为指针对指针。
  • 您可能需要char flag[] = "-B"; 之类的东西,然后您可以将flag地址作为char ** 传递为myClass(2, &amp;flag)
  • @DavidC.Rankin 你错过了一个链接:应该有一个char const * 指向标志[0]。或者,char const *flag = "-B";.

标签: c++ constructor


【解决方案1】:

第一层是指向char *的第一个指针。第二级是指向c-string的第一个const char的指针。

> cdecl explain "const char ** args"
declare args as pointer to pointer to const char

如果你有 -std=c++11 可用,你可以使用这个例子(但它可以重写为使用旧标准):

#include <iostream>
#include <vector>
#include <string>    

class test {
  public:
    test(const std::vector<std::string> & args) {
      for (auto & arg : args) {
        std::cout << arg << "\n";
      }
    }

    test() : test{{"-B"}} {}
};

int main(int argc, const char ** argv) {
  test sth{{argv+1, argc+argv}}; // skip program name here
  test sth_else;

}

【讨论】:

    【解决方案2】:

    const char** 是指向const char* 的指针。在您的情况下,您打算将多个参数作为argv 的一部分传递,因此您可以传递如下内容:

    const char* argv[] = {"<program name>", "B"};
    myClass m(2, argv);
    

    注意:const char** x & const char* x[] 相同。当想要“表示”一个数组时,第二种语法很有用。

    在这里,我提供了一种模拟 main(int, char**) 函数参数的方法,用于您的内部测试。如果你想从默认构造函数传递到参数构造函数,那么上面所有的东西都必须全局化。

    【讨论】:

    • 小心:在您的示例中,argv 不是 const char**,并且注释没有解释这种差异。
    • 没有理由相信问题中的代码准确地代表了真实代码。这是一个“类似这样”的例子。也就是说,如果您真的认为值得提供答案,那么我认为您应该解决与“采用主要命令行参数”的目标不兼容的问题。
    • @juanchopanza,没错,我已经在答案中提出了这一点。看来,OP希望将这些参数传递给自己的类以进行进一步处理。此外,main() 中的 char** 是出于 C 遗留原因(当时不存在 const)。这就是原因,我提出了const char**,因为它从未打算改变argv
    • @Cheers,似乎 OP 想要使用构造函数的委托对 main 的参数传递给自己的类进行单元测试。 main() 出于遗留原因接受 char**,但实际上它们应该被视为 const char**。我已经把它放在代码中了。如果您认为需要更多解释,请随时在此处发表评论或编辑答案。
    猜你喜欢
    • 2012-07-21
    • 2011-10-24
    • 2011-12-26
    • 1970-01-01
    • 2010-10-27
    • 2013-03-07
    • 2011-11-25
    • 2020-09-09
    相关资源
    最近更新 更多