【问题标题】:c++ notation - namespace - class - functionc++ 符号 - 命名空间 - 类 - 函数
【发布时间】:2014-09-25 11:56:40
【问题描述】:

我正在按照一个简单的教程来创建一个 DLL。 在这个过程中,我对 cpp 文件中的一些符号感到有些困惑

dll.h - the header file
#blablablabla
namespace TutTest {
    class TutTestClass { //for very complicated math!!!
    public:
        static dll_API double Add(double a, double b);
        static dll_API double Subtract(double a, double b);
        static dll_API double Multiply(double a, double b);
    };
}

dll.cpp - the cpp file :)
#blablablabla include and such
namespace TutTest{
    double TutTest::Add(double a, double b){
        return a + b;
    }
    double TutTestClass::Subtract(double a, double b){ 
        return a - b;
    }
    double TutTest::TutTestClass::Multiply(double a, double b){
        return a * b;
    }
}

在上面的 .cpp 文件中,默认符号(在本教程中使用)是“double TutTest::...”,但是我使用它并注意到“TutTestClass::”和“TutTest:: TutTestClass::" 似乎有效,因为 IDE 不会抛出任何错误/警告。

所以我想知道,这 3 个符号的意思是一样的吗?它们是等价的吗? 如果是,除了个人编码风格之外,这些符号之间有什么区别吗? 还是这些符号的含义不同?

【问题讨论】:

  • 它不应该被编译,因为TutTest::Add(...是一个错误
  • 这真的与符号有关吗?也许您的意思是名称空间和范围?你不会用符号做任何事情。您使用一个,非常标准。
  • 如果你有一个TutTest 命名空间,为什么要在TutTestCClass 中命名这个类?对我来说似乎很愚蠢。只需将其命名为 Class 或其他名称。
  • @luk32 你可能是对的,这只是反映了我的肤浅知识:p
  • @JohnDibling 是的,我注意到在第二次玩它时。将其重命名为 TTestClass。如果你是因为类名长而问的,那这几乎是无关紧要的,因为它只是一个测试:p,我也想使用更多的类

标签: c++ notation


【解决方案1】:

TutTestClass::Subtract 是正确的。 Subtract 是类TutTestClass 的(静态)成员函数,因此您必须相应地对其进行限定。

TutTest::TutTestClass::Multiply 在技术上是正确的,但很奇怪。在命名空间TutTest 中,名称TutTestClass 自动引用TutTest::TutTestClass,因此明确限定该名称是多余的。

TutTest::Add 不应该编译。这试图做的是在命名空间TutTest 中定义一个命名空间范围函数Add。但是,您只能在以下情况下使用限定名称来声明命名空间范围的函数

  1. 函数已经在命名空间中声明,并且

  2. 声明发生在相关命名空间之外。

这些都不适用于您的情况。

【讨论】:

  • 所以我可以写“class TutTestClass{ double TutTestClass::Add()}”,而这里的“TutTestClass::”也是多余的? “namespace TutTest{ class TutTestClass{}}”怎么样,“namespace TutTest”在这里会被冗余,对吧?
  • @VLV 根据经验,您只能限定已经存在的内容。使用TutTestClass::Add 声明Add inside TutTestClass 是错误的,它必须只是Add。我不明白您关于 namespace TutTest 多余的评论:您需要打开命名空间才能将声明放入其中。
  • 我明白了,这也是有道理的 :) 命名空间 TutTest 在头文件中打开了,所以它已经被使用过,那么在 cpp 文件上也使用它是多余的,如果这样做的话感觉
  • @VLV 不多余,因为是在头文件中打开的;它在那里再次关闭(通过匹配的})。它在 .cpp 文件中是多余的,因为声明在其中(在分隔命名空间的 {} 之间)。
【解决方案2】:

一个命名空间包括它自己和它的anchestores,因此TutTest::里面的TutTest什么都不做。

但正因为如此,TutTest::AddTutTest::TutTestClass::Add 不同。 (您实际上是在定义另一个从未声明过的函数)

namaspace TutTest { ... } 内,您可以避免使用TutTest::,但要在类后台之外定义类成员(即使是静态的),您需要使用它所属的类来限定函数名。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多