<< 前 ホーム 次 >>

bakaid: 20061202

リファクタリングの1つに、『オブジェクトが持つ
コレクション・メンバを直接返さない』っていうのが
あります。正式名称は確かEncapsulate Collection。

で、それをC++でやろうとしてたんですけど。その結果が
これ:

void
CDrawAppDoc::getModels(std::vector<RectModel*>& out)
{
    std::vector<RectModel*>::iterator where = out.begin();
    std::vector<RectModel*>::iterator first = models.begin();
    std::vector<RectModel*>::iterator last = models.end();
    out.insert(where, first, last);
}

どう見ても狂ってるようにか見えないんで、ここで怒りを
ブチまけようとしたんですけど、すぐに正しいやり方が
わかりました:

void
CDrawAppDoc::getModels(std::vector<RectModel*>& out)
{
    out = models;
}

--

いろいろあがいてみたけど、結局のところ、
vsvars32.batに書かれている内容をコンパネの環境変数に
登録するしかなさそうだという結論。それでCygwinの
makeでdevenvとかvcbuildとかが走るようになる。

対話だけだったら、VS用のcmd.exeを使えばいいんだけど、
そうじゃないから。

--

(defun my-c++-mode-hook ()
  (c-set-style "stroustrup")
  (setq c-basic-offset 4)
  (setq indent-tabs-mode nil)
  (local-set-key [f3] 'switch-c++-buffer))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)

(defun switch-c++-buffer (&optional buffername)
  (interactive)
  (if (not buffername)
      (setq buffername (buffer-name)))
  (let ((basename (file-name-sans-extension buffername))
        (extension (file-name-extension buffername)))
    (let ((filename (concat basename "." (c++-paired-extension extension))))
      (find-file filename))))

(defun c++-paired-extension (extension)
  (cond ((string= "h" extension) "cpp")
        ((string= "cpp" extension) "h")
        ((string= "hh" extension) "cc")
        ((string= "cc" extension) "hh")
        ((string= "hxx" extension) "cxx")
        ((string= "cxx" extension) "hxx")
        ((string= "H" extension) "C")
        ((string= "C" extension) "H")
        (t nil)))

ちなみに、何度も書いてるけど:

(setq indent-tabs-mode nil)

するなら:

(defun my-c-common-mode ()
  (define-key c-mode-base-map "\C-cc" 'compile)
  (define-key c-mode-base-map "\C-ce" 'next-error)
  (c-toggle-hungry-state 1))
(add-hook 'c-mode-common-hook 'my-c-common-mode)

みたくc-toggle-hungry-stateをセットしておくように。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails