gpt4 book ai didi

C++ 将源文件中的某些函数设为私有(private)的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-01 14:03:53 24 4
gpt4 key购买 nike

// myclass.h
#pragma once
void publicFunction();

//------
// myclass.cpp
#include "myclass.h"
#include <iostream>

void privateFunction() {
std::cout << "Hello world\n";
}

void publicFunction() {
privateFunction();
}

//-------
// main.cpp
#include "myclass.h"
#include <iostream>

void privateFunction() {
std::cout << "Hello main\n";
}

int main()
{
privateFunction();
}
上述程序将无法编译( privateFunction(void) already defined in myclass.obj )。解决此问题的一种方法是定义 namespace在源文件中:
#include "myclass.h"
#include <iostream>

namespace MyClass
{
void privateFunction();
// add a bunch other private functions here
}

void MyClass::privateFunction() {
std::cout << "Hello world\n";
}
//---
using namespace MyClass;

void publicFunction() {
privateFunction();
}
这是解决这个问题的正确方法吗?我觉得这可能会在以后引起一些问题,但我不知道正确的方法是什么。

最佳答案

如果在头文件中声明函数,那不是private首先。如果 privateFunction应该是一个实现细节,考虑只在翻译单元中声明它。为此,您有两种常见的选择。

  • 使用匿名 namespace在实现文件中。
    namespace {
    void privateFunction() {
    std::cout << "Hello world\n";
    }
    }
    这样就可以调用privateFunction()来自 publicFunction , 仍然保护 privateFunction 的任何使用从编译单元外部。
  • 制作函数static翻译单元内。
    static void privateFunction() {
    std::cout << "Hello world\n";
    }
    与 1 的效果相同。

  • 在 1. 和 2. 之间进行选择主要是一个品味问题。如果您希望对函数定义进行排序,以使被调用的函数出现在调用函数的下方,请使用 2.,因为 1. 在其声明点强制执行函数定义。
    请注意,这种隔离的一个缺点是降低了为辅助函数编写特定单元测试的能力,因为您无法链接来自“外部”的那些。

    关于C++ 将源文件中的某些函数设为私有(private)的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63426444/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com