D编程语言中的指针,函数和数组

时间:2014-03-20 11:44:57

标签: arrays class pointers d

我正在编写一个方法来同时输出到多个输出流,我现在设置它的方式是我有一个LogControllerLogFile和{{1} },后两者是LogConsole接口的实现。

我现在尝试做的是为Log添加一个附加LogController接口任何实现的方法。

我想如何做到这一点如下:在Log我有一个关联数组,我在其中存储指向LogController个对象的指针。当调用Log的{​​{1}}方法时,我希望它然后遍历数组的元素并调用它们的writeOut方法。后者我能做到,但前者证明是困难的。

法/效用/ LogController.d

LogController

法/效用/ LogFile.d

writeOut

我已经尝试过使用附加功能的多个内容,但没有一个。构建失败,并出现以下错误:

module Mage.Utility.LogController;

import std.stdio;

interface Log {
    public void writeOut(string s);
}

class LogController {
    private Log*[string] m_Logs;

    public this() {

    }

    public void attach(string name, ref Log l) {
        foreach (string key; m_Logs.keys) {
            if (name is key) return;
        }

        m_Logs[name] = &l;
    }

    public void writeOut(string s) {
        foreach (Log* log; m_Logs) {
            log.writeOut(s);
        }
    }
}

这是有罪的功能:

module Mage.Utility.LogFile;

import std.stdio;
import std.datetime;

import Mage.Utility.LogController;

class LogFile : Log {
    private File fp;
    private string path;

    public this(string path) {
        this.fp = File(path, "a+");
        this.path = path;
    }

    public void writeOut(string s) {
        this.fp.writefln("[%s] %s", this.timestamp(), s);
    }

    private string timestamp() {
        return Clock.currTime().toISOExtString();
    }
}

谁能告诉我这里哪里出错了?我很难过,而且我无法在任何地方找到答案。我尝试过多种不同的解决方案,但都没有。

1 个答案:

答案 0 :(得分:5)

D中的类和接口是引用类型,因此Log*是多余的 - 删除*。同样,不需要在ref中使用ref Log l - 这就像在C ++中通过引用指针一样。

这是您发布的错误消息的原因 - 通过引用传递的变量必须完全匹配类型。删除ref可以解决错误。