相关疑难解决方法(0)

如何在类noexcept之外定义默认构造函数?

我知道标记为的构造函数将尽可能=default"尝试" noexcept.但是,如果我在类之外定义它,它就noexcept不再存在了,正如您可以从此代码中看到的那样:

#include <iostream>
#include <utility>
#include <type_traits>

struct Bar
{
    Bar() = default;
    Bar(Bar&&) = default; // noexcept
};

struct Foo
{
    Foo() = default;
    Foo(Foo&&);
};
// moving the definition outside makes it noexcept(false)
Foo::Foo(Foo&&) = default; // not noexcept anymore

int main()
{
    Foo foo;
    Bar bar;
    std::cout << std::boolalpha;
    // checks
    std::cout << std::is_nothrow_move_constructible<Bar>::value << std::endl;
    std::cout << std::is_nothrow_move_constructible<Foo>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如何=default在类外部定义这样的构造函数并制作它noexcept?为什么这样的构造函数noexcept(false)在类外定义?通过智能指针实现 …

c++ default-constructor noexcept c++11

6
推荐指数
1
解决办法
338
查看次数

拆分C ++类声明

我想知道我是否可以拆分C ++类声明

原班

    class P
    {
        private: 
           int id;
           //some really secret method
           int secretMethod();
       protected:
           int x;
       public:
           P();
           int getX();
    };
Run Code Online (Sandbox Code Playgroud)

我只想在.h中显示public和protected方法和属性,并在其他地方声明private,而类的用户看不到它。

想要的类声明:

    class P
    {
       protected:
           int x;
       public:
           P();
           int getX();
    };
Run Code Online (Sandbox Code Playgroud)

编辑:我想要的是:

  1. 我可以更改类的实现,并且对于该类的用户是透明的
  2. 用户更容易看到更少的信息
  3. 如果我更改类的实现,请更改私有属性和方法,我不想为该类的用户更改.h

c++

5
推荐指数
1
解决办法
5824
查看次数

隐藏C++接口的具体实现

我对更高级的 C++ 功能还比较陌生......所以请记住这一点;)

我最近为某个类定义了一个接口,当然,仅包含纯虚函数。

然后,我在单独的文件中实现了该接口的特定版本。

问题是......我如何在用户端调用该接口的特定实现,而不透露该特定实现的内部结构?

因此,如果我有一个如下所示的 Interface.h 头文件:

class Interface
{
  public:
    Interface(){};
    virtual ~Interface(){};
    virtual void InterfaceMethod() = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,一个特定的Implementation.h头文件如下所示:

class Implementation : public Interface
{
  public:
    Implementation(){};
    virtual ~Implementation(){};
    void InterfaceMethod();
    void ImplementationSpecificMethod();
}
Run Code Online (Sandbox Code Playgroud)

最后,在 main 下,我有:

int main()
{
  Interface *pInterface = new Implementation();
  // some code
  delete pInterface;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做这样的事情,而不透露“main”中Implementation.h的细节?难道就没有办法告诉“main”吗……嘿,“实现”只是“接口”的一种;并将其他所有内容保存在单独的库中?

我知道这一定是一个重复的问题......但我找不到明确的答案。

谢谢您的帮助!

c++ implementation interface hide

5
推荐指数
1
解决办法
7439
查看次数

C++ 使头文件的一部分对客户可见

我的 C++ 软件使用另一个收集常见类/函数的存储库。很多时候,我的软件只使用一个头文件中提供的几个相关类之一。假设外部存储库有一个文件“data_types.h”,包含三个类。

class X { // definition }

class Y { // definition }

class Z { // definition }
Run Code Online (Sandbox Code Playgroud)

我的项目使用class Y来自标题。当发布给客户时,我需要包含我的 lib 文件以及 this 的定义class Y。如何向客户隐藏 X 类和 Z 类(因为它们未在我的项目中使用)?

有某种包装方法可以推荐吗?

c++

1
推荐指数
1
解决办法
59
查看次数

为什么要在类中使用唯一指针

最近我遇到了一个包含私有唯一指针成员变量的类。在构造函数中它用 make_unique 初始化,在析构函数中用 reset 清除。我知道 make_unique 执行堆分配。这种开销有什么原因吗?为什么不使用“普通”成员变量。

c++ c++11

-1
推荐指数
1
解决办法
157
查看次数