【问题标题】:Should this function be static?这个函数应该是静态的吗?
【发布时间】:2017-12-28 18:04:19
【问题描述】:

我刚刚得到了一个代码示例,无法修改:

#include <iostream>
#include "Image.h"
#include "Ppm.h"

int main() {

    Image* ob = 0x0;

    try
    {
        ob = new Ppm("lena.ppm");
        long kolor = countColors(*ob);
        std::cout << "Unikalnych kolorow: " << kolor << '\n';
    }
    catch (ImageError& e)
    {
        std::cout << e.what() << std::endl;
    }

    delete ob;
    return 0;
}

我对线感到困惑

long kolor = countColors(*ob);

两个问题: 1)这个函数应该是静态的吗? 2) 它应该在 Image 类中,还是在 Ppm 中,从第一个继承?

【问题讨论】:

  • 假设我们并不都知道所有这些类型是什么。你想解释一下吗?
  • 1.很可能没有。 2.(很可能)不,因为它前面缺少blah. 或blah-&gt; 或blah::。
  • 诀窍是我不允许向该代码添加任何内容,所以基本上我不能只添加例如。范围运算符:/
  • 那么,你应该写什么?函数countColors 可以是静态函数,但不能是Image 或Ppm 的成员,因为不能这样调用成员函数。
  • 是的,我知道我会有内存泄漏,是的,我知道当函数为静态时,我将无法调用成员函数(这只是一种想法)它假设是一个代码,它使用地图返回图像中的许多独特颜色(例如,在 *.ppm 格式中)

标签: c++ image inheritance static


【解决方案1】:

我对线感到困惑

long kolor = countColors(*ob);

你说代码不能修改,所以代码中已经有这行了,我假设代码正在编译/链接OK?

如果编译成功,则必须从 Image.h 或 Ppm.h 或其中一个包含的头文件中包含 countColors() 的函数 declaration。它肯定不是来自iostream。

如果链接成功,则包含countColors() 的函数定义 的目标文件或库必须包含在链接步骤中。

我们只能猜测这个函数的签名;类似:

long countColors(const Ppm& portablePixmap);

...或者也许...

long countColors(const Image& image);

无论签名是什么,都不会使用关键字static(在类之外)声明它,除非它只在实现它的同一文件中使用。

1) 这个函数应该是静态的吗?

简短的回答是:它不太可能被声明为静态(请参阅下面的原因),但这可能不是您真正要问的。

我们知道countColors() 不是类方法或实例方法,因为如果是,您将必须调用像这样1:

long kolor = SomeClass::countColors(*ob); // (class method)

或

long kolor = some_instance.countColors(*ob); // (instance method)

所以如果它不是类或实例方法,它是静态的吗? 可能不会;原因如下:

假设你在文件 foo.c 中定义了一个函数 foo:

void foo(void) { ... }

...你可以从 bar.c 调用它:

#include "foo.h" // Tells compiler about foo()

void bar() { foo(); }  // COMPILES AND LINKS OK

...但是如果您在 foo.c 中使用 static 关键字定义了该函数:

static void foo(void) { ... }

...链接器将其视为 foo.c 的私有文件,因此您不能从 bar.c 或除 foo.c 之外的任何其他源文件调用它:

#include "foo.h" // Tells compiler about foo()

void bar() { foo(); }  // COMPILE OK, BUT LINKER ERROR!

2) 它应该在 Image 类中,还是在 Ppm 中,继承自第一个类?

'should' 表示您正在寻找放置此方法的正确位置,但您还声明此代码不能修改。

您是否尝试从自己的代码中调用此方法,但不确定要包含哪个头文件或如何调用它?

对不起,如果我明白你想要做什么,我可以给你一个更好的答案。


1在 C/C++ 中使用 #define countColors(x) SomeClass::countColors(x) 等宏可能会做坏事,但我们会忽略这种可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 2022-06-16
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多